我正在尝试使用node.JS执行两个函数async series。 但我不明白这样做。
现在,我有:
功能1:
function search(client_id, callback) {
clientRedis.keys('director:*', function (err, results) {
results.forEach(function (key) {
clientRedis.hgetall(key, function (err, obj) {
//SAVE RESULT
console.log('save');
});
});
});
callback(null, results);
}
功能2:
function range(client_id, callback) {
//Sort my array
callback(null, results);
}
我在这里称这个功能:
async.series([
search(client_id),
range(client_id);
], function (err, result) {
console.log(err);
console.log(result);
});
我的问题:第二个功能是在第一个功能之前执行,因为第一个功能需要更多时间。我需要结果首先使用函数2来扩展我的数组。
答案 0 :(得分:0)
search(client_id)
和range(client_id)
将立即执行,将callback
参数分配给undefined
,然后async.series
将尝试将这些函数的结果作为一系列执行,可能会失败,因为那些不是函数,而是undefined
。或者更确切地说,如果函数没有尝试undefined(null, results)
,那就会。{/ p>
请注意,如果f
是一个函数,f(...)
会执行它。您需要将函数本身传递给async.series
,而不是将其执行结果。
async.series
希望您传入任务的数组或对象,每个任务都是function(callback) { ... }
。
因此,以下内容应该有所帮助:
async.series([
function(callback) { search(client_id, callback); },
function(callback) { range(client_id, callback); }
]...)
如果您在Haskell中写作,支持currying,那么您的代码就是正确的;但在JavaScript中,f(x)(y)
与f(x, y)
不同。
你也不要从Redis成功函数中调用callback
,这也会弄乱你的时间。
答案 1 :(得分:0)
您应该使用async.waterfall
代替async.series
来获取第二个函数中的第一个函数结果。
运行函数的tasks数组,每个函数将结果传递给数组中的下一个。但是,如果任何任务将错误传递给它们自己的回调,则不执行下一个函数,并立即调用主回调并显示错误。
而且,您的代码中存在重大错误。如果我理解你的代码,你想在修改所有结果后转到第二个函数并返回第二个函数吗?在这种情况下,请使用async.each
代替result.forEach
并在异步后调用回调:
function search(client_id, callback) {
clientRedis.keys('director:*', function (err, results) {
var savedElems = [];
async.each(results, function (key, done) {
clientRedis.hgetall(key, function (err, obj) {
if (err) {
return done(err);
}
savedElems.push(obj);
done();
});
}, function (err) {
if (err) {
return callback(err);
}
callback(null, savedElems);
});
});
}
答案 2 :(得分:0)
如果您不直接使用第二个函数的结果(仅通过redis),您可以使用以下内容:
async.series([
search.bind(null, client_id),
range.bind(null, client_id)
], function (err, results) {
console.log(err);
console.log(results[0]); // for search results
console.log(results[1]); // for range results
});