一切都是异步的。 Http.request在完成后会得到函数回调。 问题是调用http.request的函数是基于http请求的结果以递归和非确定的方式调用的。
我怎么知道我在这个异步世界里真的完成了什么? 只需保持“任务开始与任务完成”计数器? 有更优雅的方式吗?
答案 0 :(得分:1)
async
模块有许多用于组织异步任务的实用工具。
例如,如果您有一个想要获取的网址数组:
var http = require('http');
var async = require('async');
var urls = ['http://google.com', 'http://nodejs.org', 'http://stackoverflow.com'];
async.map(urls, function(url, cb) {
http.get(url, function(res) {
var buf = '';
res.on('data', function(d) {
buf += d;
}).on('end', function() {
cb(null, buf);
});
});
}, function(err, responses) {
// responses is an array containing response bodies of a GET to each url:
// responses[0] = response for google.com
// responses[1] = response for nodejs.org
// ...
});
答案 1 :(得分:0)
这是一个很好的问题,目前有一个更好的解决方案:
创建一个promise并使用promise.all,如果您希望100%异步,请使用promise resolve使用下一个arg再次调用该函数。
通过这种方式,可以100%确保一旦完成了最后一个承诺,其他所有承诺都将实现。
我确实建议async.queue具有可控制级别的并发处理