目前我有一个仪表板,列出了表格中的一堆记录。用户可以选择1条记录并点击执行,然后向我的路由中间件发送一个AJAX POST请求,该中间件在async.waterfall中执行3个函数,如果一切正常,则将200响应返回给我的客户端。这个异步瀑布通常需要大约40-55秒才能完成执行( fn_1,fn_2和fn_3 ),并且工作正常。
router.post('/url', function(req, res, next) {
try {
async.waterfall([
fn_1,
fn_2,
fn_3
], function (err, body) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({"error":err, "result":body}));
});
function fn_1(callback) {
callback(null, response);
}
function fn_1(result, callback) {
callback(err, result);
}
function fn_2(result, callback) {
callback(null, result);
}
}
catch (err){
console.log(err)
}
});
但是,如果我要为用户提供选择 MULTIPLE 记录的规定,并将其作为数组发送回我的路由中间件。如何为数组中的每个项目执行多个async.waterfall方法并行
我可以运行循环并在循环内执行瀑布,但它会再次等待每个项目完成,然后才开始下一次迭代。这不是我想要的。
这在node / express中是可行的。什么是实现这一目标的最简单方法?或者是否有可以帮助解决这种情况的模块/插件?
答案 0 :(得分:0)
以下是您的代码的缩写版本以及如何根据您的需求进行更改。如果您的任何呼叫都不需要来自任何其他呼叫的数据,您可以与promises并行运行它们,并使用Promise.all
来捕获结果。
function fn_1(callback) {
// See function fn_2 for structure
}
function fn_1(result, callback) {
// See function fn_2 for structure
}
function fn_2(result, callback) {
return new Promise(resolve, reject => {
resolve(result)
})
.then(d => {
// Instead of callbacks, use a "then"
// block/statement.
//
// Do something with D here.
})
}
Promise.all([fn_1(), fn_2(), fn_3()])
.then(v => {
// Do somthing with v;
})
.catch(e => {
// Do something with e
})
答案 1 :(得分:0)
我倾向于提倡使用本机Promise而不是像async这样的库,因为你已经使用异步...
您可以使用parallel并将数组中的每个项目映射到瀑布处理程序,例如
async.parallel(
myArray.map(val => cb => async.waterfall(fn_1, fn_2, fn_3, cb)
, (err, results) => {
// return consolidated response
})
您需要重新设计瀑布处理程序,以便不发送响应,而只是传播任何错误。
还应该注意,并行仅在运行I / O绑定代码时才有用,如果代码类似于您的示例,那么您将无法通过async.each之类的东西使用并行获得任何东西< / p>