这里有两个例子,一个是一个一个地保存结果async.eachSeries
,一个是收集所有结果,async.mapSeries
然后一次保存所有结果
URLs = ["http://a", "http://s", "http://d"];
function iterator1(URL, done){
var options = {};
needle.get(URL, options, function(error, response, body){
if(error){ return done(error) };
processAndSaveInDB(body, function(err){
if(err){ return done(err) };
done(null);
});
});
};
async.eachSeries(URLs
, iterator1
, function (err){
// global callback for async.eachSeries
if(err){
console.log(err)
} else {
console.log('All Needle requests successful and saved');
}
});
// Here is a similar technique using async.map, it may be more suitable
function iterator2(URL, done){
var options = {};
needle.get(URL, options, function(error, response, body){
if(error){ return done(error) };
done(null, body);
});
};
async.mapSeries(URLs
, iterator2
, function (err, results){
// global callback for async.mapSeries
if(err){
console.log(err)
} else {
console.log('All Needle requests successful');
// results is a 1 to 1 mapping in order of URLs > needle.body
processAndSaveAllInDB(results, function(err){
if(err){ return done(err) };
console.log('All Needle requests saved');
done(null);
});
}
});
我不清楚如何使用异步来确保 Needle 请求已经完成,并在移动到下一个 URL 请求之前相应地存储该响应。
异步函数的series
变体负责这一点;您只需确保done
在准备好继续之前不要调用迭代器函数的回调。在实践中,这意味着将调用done
放在你最里面的回调中(例如你的 Needle 回调)