javascript - Async.js 设计模式

标签 javascript node.js asynchronous async.js

我正在为我的 node.js 应用程序使用 async.js。我需要帮助解决以下问题。

假设我有以下 aysnc js 系列函数。

async.waterfall([
    function getDataFromDB(request, response, callback){ ... },
    function someOperationOnDBData(dbData, response, callback){ ... },
    function renderSomeFlow(evaluatedData, response, callback){ ... }
]);

我按上述顺序调用了三个函数。我从 getDataFromDB 获取数据并传递给 someOperationOnDBData 等等。

假设我在 getDataFromDBsomeOperationOnDBData 之间还需要一个操作,但仍向前传递 DBData。例如:

async.waterfall([
    function getDataFromDB(request, response, callback){ ... },
    function extraOperation(dbData, response, callback) {...}
    function someOperationOnDBData(dbData, extraOperationData, response, callback){ ... },
    function renderSomeFlow(evaluatedData, response, callback){ ... }
]);

这里在中间添加一个步骤会更改函数定义,我还需要在 extraOperation 中传递 dbData 以将其转发给 someOperationOnDBData。 另外,如果我在中间调用不同的模块,可能无法更改它的参数来转发一些数据。

如何解决async.js中函数间传递数据,中间函数不转发数据的问题?每次包含新步骤时都重构函数是不可能的。解决此类问题的设计模式是什么?

最佳答案

使用 waterfall 你必须传递数据 - 你不能在中间停止 waterfall :)。您可能想使用其他替代方法,例如 auto它允许您指定哪些函数依赖于其他函数的结果,异步将确定运行它们的最佳顺序。

我发现 auto 的语法有点笨拙,但它可以满足您的需要。这是一个例子:

async.auto({
    db: function getDataFromDB(callback){ ... },
    extra: ['db', function extraOperation(results, callback) {...}],
    some: ['db', function someOperationOnDBData(results, callback){ ... }],
    render: ['some', 'db', function renderSomeFlow(results, callback){ ... }]
});

关于javascript - Async.js 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964527/

相关文章:

javascript - 管理员登录后如何访问网站的其他页面

javascript - Gulp 实时重载

javascript - 使用 FileReader 和 readAsArrayBuffer 读取多个文件

javascript - JQuery 事件在 .addClass 之后不起作用

javascript - window.requestAnimationFrame 静默调用回调失败,但在跨域 iframe 内部调用时生成有效的 requestID

c++ - nodejs 插件异步回调与 libuv

c# - Azure函数: StatusCode cannot be set because the response has already started

Javascript:在 DOM 中异步生成大表。

javascript - 在 jQuery 的数据属性中存储数据 VS javascript 字符串

javascript - 如何从子 flash swf 文件向 HTML 文档插入 javascript 函数?