我有类似的东西
var async = require('async');
var request = require('request');//request urls
var urls = ['url1','url2', 'url3' ];
function requestUrl( url, callback){
console.log(callback.toString());
request(url, function(err, resp, body){
callback(null, body)
})
}
function cb(err, results){ console.log(results); }
然后我通过
来调用它async.map(urls, requestUrl, cb);
我的'cb'永远不会被召唤。我在第二个参数中使用.toString()方法函数打印出'回调',它看起来像这样。
function (err, v) {
results[index] = v;
callback(err);
}
为什么忽略我的回调并把它放在自己的回调中?
答案 0 :(得分:1)
arr - 要迭代的数组。
iterator(item,callback) - 迭代器传递一个回调(错误,转换),一旦完成错误(可以为null)和转换项,就必须调用它。
callback(err,results) - 可选当所有迭代器函数完成或发生错误时调用的回调。结果是来自arr。
的转换项的数组结果是一个数组。
看看这个runnable。
var async = require('async');
var request = require('request');
var urls = ['http://www.google.fr', 'http://twitter.fr'];
function requester(url, done) {
console.log('request: %s', url);
request(url, function(err, r, body) {
console.log('request is done');
console.log('have error on it ?', err !== null);
if (err) return done(err);
var res = res;
var b = body;
done(null, {
response: r,
body: b
});
})
}
async.map(urls, requester, function(err, r) {
console.log('async callback');
console.log('have error on it ?', err !== null);
if (err){
console.log('on error', err);
return;
}
console.log('it\'s a success! Now take a look at result :)');
console.log('results[%s]', r.length);
});
如果您调用自己的端点(例如http://localhost:3000/your/endpoint),请确保此请求不会导致您的节点应用崩溃。
答案 1 :(得分:0)
这是我的错。当您请求数据并且该请求失败时,异步往往会无声地失败并且不会返回您的请求。如果您的请求似乎没有回复,我会打印出任何和所有错误,并检查是否有任何条件未得到满足。
例如我有一个
if
else if
但是两者都没有执行,导致它挂起并造成难以查明的不稳定行为。干净的节目中有3个小时令人沮丧的教训。