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
等。
假设我需要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){ ... } ]);
这里在中间添加一个单独的步骤会改变函数的定义,而且我需要在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函数的很多很好的例子