我正在为我的 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
等等。
假设我在 getDataFromDB
和 someOperationOnDBData
之间还需要一个操作,但仍向前传递 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/