2016-12-06 74 views
-1

爲什麼如果你這樣做:爲什麼fs.readFile以不同的順序返回?

for (var i = 0; i < 5; i++) { 
    fs.readFile('file' + i, function(err, data) { 
     console.log('file: ', data); 
    }); 
} 

你每次不同的結果?

我猜它與節點的「異步」事件循環有關,但不確定這是如何工作的。

+0

fs.readFile是異步的。你是在自問自答。文件可能以不同的速度讀取。 –

+0

我知道它的異步,我想知道每次有什麼區別,它是隨機的嗎,爲什麼不每次都以相同的順序返回它們?它沒有提出外部請求,只是讀取文件,爲什麼它每次都以不同的順序讀取它們,是什麼讓它們在讀取文件時更快? 你可以閱讀我選擇瞭解我在問什麼的答案;) – Deviljho

回答

1

異步fs方法利用libuv的線程池和那些線程的執行可以訂購/由操作系統調度的不同(特別是根據由操作系統使用調度器的類型)。

+0

我認爲這是最接近我所尋找的,謝謝。 – Deviljho

0

這將關閉並獲取文件,每次完成時將數據返回給您的回調。你永遠不會知道哪些將首先完成或訂單。如果您需要等待所有5個文件,然後再查看異步庫:https://www.npmjs.com/package/async

fs.readFile('file' + i, function(err, data) { 
    console.log('file: ', data); 
}); 
+0

是的,我知道如何處理它們,只是想知道他們爲什麼會以不同的順序返回,可能是在較低的水平。 – Deviljho

0

你可以這樣做: -

for (var i = 0; i < 5; i++) { 
    // put the statement in try-catch in case some of the files do not exists or 
    // you get some other error 
    try { 
     // to show actual contents of the file instead of a buffer 
     console.log(fs.readFileSync('file' + i).toString()); 
    } catch (error) { 
     console.error(error); 
    } 
} 

我會建議不要使用這一點,但如果你有,那麼這是方式之一。您應該按照@ jordan-s的建議結賬async.js http://caolan.github.io/async/docs.html#map

+0

是的,實際上並沒有尋找不同的方法,我只是想知道爲什麼異步過程的順序返回無序,如果它們總是以相同的順序調用。 – Deviljho

相關問題