我正在为我的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中的函数之间传递数据而不在中间函数中转发数据的问题?每次包含新步骤时都重构函数是不可能的。解决这类问题的设计模式是什么?
发布于 2016-06-22 17:57:54
使用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){ ... }]
});发布于 2017-11-23 22:16:38
我发现让你的函数使用箭头函数是解决这个问题的一种方法:
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上编写javascript函数的许多好例子
https://stackoverflow.com/questions/37964527
复制相似问题