Async.js:在另一个任务中可用的瀑布任务中创建的变量是什么?

时间:2016-12-13 15:40:55

标签: javascript node.js asynchronous async.js

我刚刚发现了Async.js,我想知道数据库查询找到文档时async.waterfall的行为是什么,以及如何通过不同的任务使用它。< / p>

我有这段代码:

var _arg1;
var _arg2;
async.waterfall([
    function (callback) { // First "dummy" callback
      callback(null, _arg1, _arg2);
    },
    function (arg1, arg2, callback) {
      foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
    },
    function (arg3, callback) {
      foo2(arg3, callback); // arg3 is the document found by the query
    },
    function (callback) {
      foo3(arg3, callback); // Here I would like to use `arg3` again
    }], 
    function (err, result) {
      if (err) {
        console.log(err);
      }
    }
);

是否可以在我的第二个任务中使用arg1,而不是每次都存储变量?

我想我可以做这样的事情,但我确信这不是最好的方法:

var _arg1;
var _arg2;
var _arg3;
async.waterfall([
    function (callback) { // First "dummy" callback
      callback(null, _arg1, _arg2);
    },
    function (arg1, arg2, callback) {
      foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
    },
    function (arg3, callback) {
      _arg3 = arg3
      foo2(arg3, callback); // arg3 is the document found by the query
    },
    function (callback) {
      foo3(_arg3, callback); // Make use gain of `_arg3` ?
    }], 
    function (err, result) {
      if (err) {
        console.log(err);
      }
    }
);

操纵任务中创建的不同变量的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

每个瀑布函数都有自己的范围,因此无法共享变量。我只能想到这两个选项:

  • 在瀑布之外声明变量(你做过的那个)
  • 使用回调
  • 将变量传递给下一个函数

第二个是这样的:

var _arg1;
var _arg2;
async.waterfall([
    function (callback) { // First "dummy" callback
      callback(null, _arg1, _arg2);
    },
    function (arg1, arg2, callback) {
      foo1(arg1, arg2, callback); // Built-in function, for example a database query returning a document
    },
    function (arg3, callback) {
      foo2(arg3, function(err) {
        if (err) {
          callback(err);
        }
        callback(null, arg3);
      });
    },
    function (arg3, callback) {
      foo3(arg3, callback); // You can use `arg3` here again
    }], 
    function (err) {
      if (err) {
        console.log(err);
      }
    }
);

根据我使用第一个或第二个的情况,在我的代码中我不能说哪一个更好。

在评论中已经指出了,但是如果你要创建新的东西,我也建议你使用Promise,通过Async.js创建的代码在复杂情况下会变得非常讨厌,特别是瀑布和类似的。