【问题标题】:Nodejs async series - pass arguments to next callbackNodejs 异步系列 - 将参数传递给下一个回调
【发布时间】:2014-04-20 21:37:07
【问题描述】:

当您使用异步模块时,如何将参数从前一个回调传递给下一个?

这是来自 github 上的文档的示例

async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});

【问题讨论】:

  • 如果您想将数据传递给下一个回调,您可能正在寻找async.waterfall 方法,而不是async.series

标签: node.js


【解决方案1】:

另一个选择是使用 async.auto。使用 async auto,您可以指定任务的依赖数据,并且 async 将在能够运行时开始运行它。 README.md 中有一个很好的例子,但这里大致是你的系列:

async.auto({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    }, 
    // If two does not depend on one, then you can remove the 'one' string
    //   from the array and they will run asynchronously (good for "parallel" IO tasks)
    two: ['one', function(callback, results){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }],
    // Final depends on both 'one' and 'two' being completed and their results
    final: ['one', 'two',function(err, results) {
    // results is now equal to: {one: 1, two: 2}
    }];
});

【讨论】:

【解决方案2】:

您可以将异步函数与异步模块的waterfall 函数链接在一起。这允许您说,“首先执行 x,然后将结果传递给函数 y,然后将结果传递给 z。”复制自 [docs][1]:

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});

您并不严格需要异步模块来完成此操作;此功能旨在使代码更易于阅读。如果你不想使用异步模块,你总是可以只使用传统的回调。

【讨论】:

  • 为什么callback的第一个参数总是null
  • @Zen 第一个参数是为错误回调保留的,如果你想添加它们。
  • 如果结果成功则callback(null, 'done');。如果你想打破特殊情况的流程,那么callback("ERROR", error_text);
【解决方案3】:

我花了很多时间解决这个问题,因为我遇到了类似的情况。我尝试了async.seriesasync.waterfall

async.series: 使用变量在回调函数之间共享。我不确定这是否是最好的方法。我必须感谢Sebastian 他关于async 的精彩文章。

var async1 = require('async');

exports.asyncSeries1 = function (req, res, callback) {

    var sharedData = "Data from : ";
    async1.series([
            // First function
            function(callback) {
                sharedData = "First Callback";
                callback();
            },
            // Second function
            function(callback){
                console.log(sharedData);
                sharedData = "Second Callback";
                callback();
            }
        ],
        // Final callback 
        function(err) {
            console.log(sharedData);
            if (err) {
                callback();
            }
            callback();
        }
    );
};

async.waterfall:我尝试使用async.apply 使用另一个回调函数。这是帮助我解决问题的一段代码。 `

var async2 = require('async')

exports.asyncWaterfall1 = function (arg1, arg2, cb) {
    async2.waterfall([
        // async.apply
        async2.apply(assignVariables, arg1, arg2),
        // First callback
        function(arg1, arg2, callback){
            console.log(arg1);
            console.log(arg2);
            arg1 = 5;
            arg2 = 6;
            callback(null, arg1, arg2);
        },
        // Second callback
        function(arg1, arg2, callback){
          // arg1 now equals 'one' and arg2 now equals 'two'
            console.log(arg1);
            console.log(arg2);
            arg1 = 7;
            arg2 = 8;
            callback(null, arg1, arg2);
        }
    ], 
    function (err, arg1, arg2) {
        console.log(arg1);
        console.log(arg2);  
    });
};

// Method to assign variables
function assignVariables(arg1, arg2, callback) {
    console.log(arg1);
    console.log(arg2);
    arg1 = 3;
    arg2 = 4;
    callback(null, arg1, arg2);
};

PSCredit.

【讨论】:

  • 这两种方法似乎都不错。我最近开始使用异步。我只想问你哪个更好或更有效的方法(对于这种情况) async.series() 或 async.waterfall()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2020-08-07
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多