我正在经历对于Node JS初学者和异步请求来说似乎是一个传统问题。
用户生成的URL数量未知,然后存储在Node JS服务器上的数组中。Node JS服务器必须遍历这些URL,依次向每个URL发出请求。它必须按顺序进行,并且必须等待每个响应,然后才能移至下一个URL(将发出新请求时)。最终结果应该是所有响应(碰巧是JSON)的有序集合,很好地存储为JSON对象,然后可以在准备好时将其发送回客户端。
我认为我应该使用async
NodeJS库,并且已经在needle
用于发出请求。
URLs = ["http://a", "http://s", "http://d"];
async.eachSeries(URLs, function (URL, callback) { ..... });
我不清楚如何使用异步来确保Needle请求已完成,并在移动到下一个URL请求之前相应地存储该响应。以下是我的Needle请求的示例。
needle.get(URL, options, function(error, response, body){ ... });
欢迎部分或全部解决整个问题。
这里有两个示例,一个示例用一个保存一个结果,另一个示例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回调)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句