2015-09-10 27 views
1

我有一個nodejs程序從服務器下載一堆文件。問題是該過程在文件實際下載之前退出,所以我得到一個損壞的文件。writeStream結束之前的節點進程退出

for(var i = 0; i < items.length; i++){ 
    var file = fs.createWriteStream(items[i].filename); 
    var request = http.get(items[i].url, function (response) { 
     console.log('got:', i); 
     response.pipe(file); 
    }); 
    request.on('end', function() { 
     console.log('done with ' + filePath); 
    }); 
} 

但是,當最後一個請求收到其響應時,進程退出。我從來沒有得到「完成」日誌。

任何人有想法?

謝謝!

+0

這是因爲你的代碼的異步的。基本上,在回調被觸發之前,你已經退出循環。 –

+0

我知道,我嘗試了es6-promise和sync-request但沒有成功... – hugohil

+0

您是否嘗試過我在答案中提供的代碼? –

回答

1

您正在錯誤地處理異步性。

嘗試使用所謂的async庫,並使用它像這樣

async.eachSeries(items, function (item, callback) { 
    var file = fs.createWriteStream(item.filename); 
    var request = http.get(item.url, function (response) { 
     response.pipe(file); 
    }); 
    request.on('end', function() { 
     console.log('done with ' + filePath); 
     callback(null); 
    }); 
}, function (err) { 
    console.log('All done!'); 
}); 
+0

謝謝你的回答,它看起來很好,但我無法做到我想要的。我想我錯過了一些東西...... 在我的主循環中,我將對象添加到一個'downloadQueue'對象數組,並使用'async.each()'方法遍歷它,但該過程仍然過早退出:/ – hugohil

+0

那麼我想它是在你的代碼中的其他地方。您可以在調用回調之前檢查代碼的哪一部分退出 –

+0

事情是我從來沒有得到「全部完成!」日誌,它似乎節點不等待異步退出其進程 – hugohil

相關問題