nodejs多线程异步并行

时间:2017-09-20 19:39:42

标签: node.js ajax multithreading express asynchronous

目前我有一个仪表板,列出了表格中的一堆记录。用户可以选择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中是可行的。什么是实现这一目标的最简单方法?或者是否有可以帮助解决这种情况的模块/插件?

2 个答案:

答案 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>