我在异步时遇到了一些问题。
这是我的代码:
Main.prototype._onlyGeoLinks = function() {
var redis = RedisClient.client
, getKeys = function(key, cb) {
redis.keys(key, cb);
}
, count = 0
//
cb = null;
async.waterfall([
function(cb) {
async.concat([
'events:*'
, 'news:*:*:*:*'
, 'deals:*'
], getKeys, cb);
},
function(keys, cb) {
// iterate keys
async.map(keys, function(key, cb) {
async.waterfall([
function(cb) {
redis.get(key, cb);
}, function(item, cb) {
log.verbose(LOG_CTX, 'Parsing item.. %d', ++count);
GeoHelper.parse(item, cb); // This are calling cb(new Error('bla'))
}
], cb) // at this point, I can read err
}, cb) // This is never called
}
], function(err, items) {
if (err) {
log.error(LOG_CTX, err);
} else {
log.verbose(LOG_CTX, items);
log.verbose(LOG_CTX, items.length);
}
})
}
我尝试了什么......
async.map(keys, function(key, cb) {
async.waterfall([
function(cb) {
redis.get(key, cb);
}, function(item, cb) {
log.verbose(LOG_CTX, 'Parsing item.. %d', ++count);
GeoHelper.parse(item, cb);
}
], function(err) {
log.error('1', err); // This prints ERR
cb(err);
})
}, function(err) {
log.error('2', err); // this is never called
cb(err);
})
我错过了什么?谢谢你的帮助。
答案 0 :(得分:0)
我发现如果映射期间的迭代器调用带有错误的cb,则会调用主cb,但地图将继续。这就是为什么我没有看到错误,输出被有效响应的输出覆盖。
如果迭代器将错误传递给此回调,则主要回调(for 立即使用错误
调用map函数