2015-09-10 23 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

相关问题