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 异步系列函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

Node.Js 中的异步问题 - 如何执行一系列操作? [复制]

5Node.js 回调函数

Node.js 文件系统

Node.js 文件系统

Node.js 回调函数

Node.js学习四 Node.js回调函数