2017-06-22 29 views
0

我正在使用node.js,我試圖讀取一個文件夾並返回file.length,然後我想寫入一個txt文件的值。問題是,當我嘗試使用fs.writeFile時,它會創建一個僅包含世界的文件undefined使用fs.writeFile時未定義的值

var length; 
fs.readdir(dir, function(err, file) { 
    length = file.length+1; 
}); 
setTimeout(function(){ 
}, 1000); 
fs.writeFile('/public/images/value.txt', length, function(err) { 
    if(err) { 
     return console.log(err); 
     } 

    console.log("The file was saved!"); 
    console.log(length); 
}); 

的console.log(長度)返回6

+1

'readdir'和'writeFile'是異步函數。您需要將'fs.writeFile'放入readdir的回調函數中,或者使用promise來解析。問題是'readFile'在'readdir'完成之前被調用,並且不,setTimeout不是一個好的方法來阻止它。 –

+0

以下是關於異步編程的文章,它將幫助您開始使用node.js的異步特性:https://stackoverflow.com/documentation/node.js/8813/asynchronous-programming#t=201706221520109316922 – forrert

回答

0

你在處理異步代碼時有一些錯誤。 fs.readir()fs.writeFile()都是異步的。這意味着,你知道他們完成的唯一方法是在他們的回調中。

fs.readdir(dir, function(err, files) { 
    if (err) return console.log(err); 
    let length = files.length + 1; 
    fs.writeFile('/public/images/value.txt', length, function(err) { 
     if(err) return console.log(err); 
     console.log("The file was saved!"); 
     console.log(length); 
    }); 
}); 

// fs.readdir() has not yet completed when this part of your code runs 
// it will complete some time late and then call its callback 
// similarly fs.writeFile() has not yet completed when this part of your code runs 

所以,如果你想使用的fs.readdir()的結果,那麼你應該使用它的回調中。如果您想知道fs.writeFile()何時完成,並依靠它的存在並獲得最新信息,則只能在其回調中執行該操作。

另外,setTimeout()不被阻塞。它所做的就是安排一個計時器,以便在將來的其他代碼繼續運行時啓動。因此,如果您打算在此處使用setTimeout(),則必須將fs.writeFile()代碼放入setTimeout()回調中。但是,這是一個黑客攻擊,並不是處理異步代碼的推薦方式。您應該將fs.writeFile()放在fs.readdir()回調中,然後事情將100%可靠。

異步結果必須在表示完成異步操作的實際回調中使用,或者在您從該回調中調用的函數中使用。

+0

@ george.angelop - 這是否回答您的問題? – jfriend00

+0

你是最棒的 –

0

時you're處理異步代碼的典型誤差。你得到未定義的原因是因爲當執行fs.writefile函數時第一個函數沒有完成目錄的讀取,所以此時的長度仍然是未定義的。嘗試將writefile函數放入setTimeout函數中。這應該使它。

+0

我試過了,但沒有奏效。我也嘗試刪除fs.readdir函數,並用var length = 6替換它;只是爲了測試它,但它與undefined有相同的問題。 –

+0

你是否在「使用嚴格」模式? – Alfon

+0

無論我是否使用「嚴格使用」,它都不起作用。 –