有一些库可以帮助您组织异步代码的执行。 Async是我使用的,它的eachSeries()在这里很有用:
function search(x,callback) {
dns.resolve(x, function (err, addresses) {
if (!err) {
res.send("bad");
} else {
res.send("good");
}
callback(err);
});
}
async.eachSeries(queries,
function(query,callback) {
search(query,callback);
},
function(err) {
if(err) {
console.log("we had an error");
}
}
);
请注意,只要其中一个迭代出现错误,Async 就会调用最终回调,因此如果您不想停在那里,则需要调用callback()
insearch()
而不是callback(err)
.
更新(不使用库):
如果你不想使用库,你可以像这样自己实现它:
function searchInternal(queries, idx, callback) {
if(idx === queries.length) {
callback();
return;
}
dns.resolve(queries[idx], function (err, addresses) {
if (!err) {
res.send("bad");
} else {
res.send("good");
}
searchInternal(queries, idx+1, callback);
});
}
function searchAll(queries, callback) {
searchInternal(queries, 0, callback);
}
searchAll(queries, function() {
console.log("all done now");
});
请注意,此代码未经测试,可能不是最佳实现,但这就是我们使用库的原因。