javascript - Async.js:在 waterfall 任务中创建的变量是否可以在另一个任务中使用?

标签 javascript node.js asynchronous async.js

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

我有这段代码:

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);
      }
    }
);

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

最佳答案

每个 waterfall 函数都有自己的作用域,因此不可能共享变量。我只能想到这两个选择:

  • 在 waterfall 之外声明变量(您所做的)
  • 使用回调将变量传递给下一个函数

第二个是这样的:

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);
      }
    }
);

我无法说哪个更好,在我的代码中取决于我使用第一个或第二个的情况。

评论中已指出,但如果您要创建新内容,我还建议您使用 Promises,通过 Async.js 创建的代码在复杂情况下可能会变得非常糟糕,尤其是 waterfall 和类似情况。

关于javascript - Async.js:在 waterfall 任务中创建的变量是否可以在另一个任务中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41125017/

相关文章:

javascript - Node js中的Redlock错误

javascript - 更新从 Mysql 查询检索到的数据? Node.js Node -mysql

javascript - Jquery 对话框不返回用户给定的确认弹出值。

python - 将异步扭曲代码集成到同步 python 代码中

javascript - 在没有ffmpeg的python中将ogg音频转换为wav

javascript - 显示/隐藏超时事件 - 无法在一定时间后触发点击

javascript - 我应该将 S3 存储桶与 form_for 图像 uploader 一起使用吗?

javascript - 具有固定纵横比 div 的居中图像的 Flexslider 幻灯片

node.js - 从子进程中获取正确的进程 ID

python - 将任务添加到 python asyncio