Async.jsdevise模式

我正在为我的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){ ... } ]); 

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

如何解决在async.js函数之间传递数据而不在中间函数中转发数据的问题? 每当包含新的步骤时,重构function都是不可能的。 解决这类问题的devise模式是什么?

使用waterfall你必须通过数据 – 你不能停止在中间的瀑布:)。 还有一些你可能喜欢使用的选项,例如auto ,它可以让你指定哪些函数依赖于其他函数的结果,而async将决定运行它们的最佳顺序。

我觉得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){ ... }] }); 

我发现用箭头函数来curl你的函数是一个围绕这个问题的方法:

 const someOperationOnDBData = extraOperationData => (dbData, response, callback) => { // do your function work }; async.waterfall([ function getDataFromDB(request, response, callback){ ... }, function extraOperation(dbData, response, callback) {...} someOperationOnDBData(extraOperationData)(dbData, response, callback), function renderSomeFlow(evaluatedData, response, callback){ ... } ]); 

关于如何在Medium.com上embeddedJavaScript函数的很多很好的例子