node.js 异步系列函数的参数
Posted
技术标签:
【中文标题】node.js 异步系列函数的参数【英文标题】:node.js async series function's arguments 【发布时间】:2014-02-12 19:27:59 【问题描述】:我需要做如下代码:
function taskFirst(k, v)
console.log(k, v);
function taskSecond(k, v)
console.log(k, v);
function run()
var g1 = "Something";
var g2 = "Something";
var g3 = "Something";
var g4 = "Something";
async.series(
[
taskFirst(g1, g2),
taskSecond(g3, g4)
],
function(error, result)
);
传递自定义变量和async.js回调函数的正确方法是什么?
【问题讨论】:
【参考方案1】:可以如下
function taskFirst(k, v)
console.log(k, v);
function taskSecond(k, v)
console.log(k, v);
async.series([
function(callback)
callback(null, taskFirst(g1, g2));
,
function(callback)
callback(null, taskFirst(g3, g4));
],function(error, result)
);
【讨论】:
这行不通。回调会立即执行,因此 async 将继续执行下一个函数。您应该将回调传递给您的函数,并在异步工作完成后全部执行它。 是的 - 这个答案假设 taskFirst 中的代码是阻塞的。【参考方案2】:你可以这样做:
function taskFirst(k, v, callback)
console.log(k, v);
// Do some async operation
if (error)
callback(error);
else
callback(null, result);
function taskSecond(k, v, callback)
console.log(k, v);
// Do some async operation
if (error)
callback(error);
else
callback(null, result);
function run()
var g1 = "Something";
var g2 = "Something";
var g3 = "Something";
var g4 = "Something";
async.series(
[
// Here we need to call next so that async can execute the next function.
// if an error (first parameter is not null) is passed to next, it will directly go to the final callback
function (next)
taskFirst(g1, g2, next);
,
// runs this only if taskFirst finished without an error
function (next)
taskSecond(g3, g4, next);
],
function(error, result)
);
【讨论】:
【参考方案3】:这个对 async 的 github 问题的回答非常适合我。 https://github.com/caolan/async/issues/241#issuecomment-14013467
对你来说,它会是这样的:
var taskFirst = function (k, v)
return function(callback)
console.log(k, v);
callback();
;
【讨论】:
谢谢,我错过了我需要包装函数并返回它:) 我需要创建一个动态函数数组,其中包含我需要提供给 async.series 的参数,您的回答帮助我朝着正确的方向前进,谢谢【参考方案4】:更好的方法。
const a1 = (a, callback) =>
console.log(a, 'a1')
callback()
const a2 = (a, callback) =>
console.log(a, 'a2')
callback()
const run = () =>
async.series([
a1.bind(null, 'asd'),
a2.bind(null, 'asd2')
], () =>
console.log('finish')
)
run()
【讨论】:
以上是关于node.js 异步系列函数的参数的主要内容,如果未能解决你的问题,请参考以下文章