在試圖學習node.js/socket.io時我一直在創建一個簡單的文件上傳器,它從客戶端瀏覽器獲取數據塊並在服務器端重新組裝。異步文件追加
用於接收塊的socket.io事件如下所示:
socket.on('sendChunk', function (data) {
fs.appendFile(path + fileName, data.data, function (err) {
if (err)
throw err;
console.log(data.sequence + ' - The data was appended to file ' + fileName);
});
});
的問題是數據塊不一定在他們由於異步調用接收的順序追加。典型控制檯輸出看起來是這樣的:
- 1 - 數據被附加到文件TESTFILE.TXT
- 3 - 中的數據是附加到文件TESTFILE.TXT
- 4 - 數據被追加到文件TESTFILE.TXT
- 2 - 將數據附加到文件TESTFILE.TXT
我的問題是,什麼是實現無阻塞方式這個功能,但執行順序的正確方法。我已經看過像async這樣的圖書館,但真的希望能夠處理它們,而不是創建一個系列,並在所有文件塊都運行後運行。我仍然試圖圍繞所有這些事件驅動流,所以任何指針都很棒。
我喜歡它。任何你知道的npm實現?似乎它可能是一個共同的需要有一個監視隊列映射給定的功能... – Vince 2013-02-17 05:52:29
我也喜歡它。但是在writeNextPart()中,不應該使用「parts.shift()」,而應該有一些邏輯來跟蹤最近寫入的序列號,並查看下一個需要的序列號是否可用於「parts」 ?也就是說,如果我們還沒有向文件寫入任何內容並且seq#2到達,我們應該繼續排隊部分,直到seq#1到達,此時我們會處理它? – 2013-02-17 17:55:31
@DanielChisholm好點,我不知道。我假定這些部分都來自同一個客戶端,並且SocketIO將保留'sendChunk'事件的順序。如果它不保留訂單,那麼這將是必要的。 – loganfsmyth 2013-02-17 18:46:22