我有这样的东西
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);
}
为什么它忽略我的回调并将其放在自己的回调中?
最佳答案
async.map(arr, 迭代器, [回调])
arr - 要迭代的数组。
iterator(item,callback) - 迭代器传递一个回调(err,transformed),一旦完成并出现错误(可以为空)和转换后的项目,必须调用该回调。
callback(err, results) - 可选 当所有迭代器函数完成或发生错误时调用的回调。 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 ),请确保此请求不会使您的 Node 应用程序崩溃。
关于javascript - 异步 map 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32126415/