如何在Node中的第一个异步并行任务完成结束?

Cha*_*her 2 javascript asynchronous node.js async.js

我有一个我想要使用https://github.com/caolan/async并行运行的任务列表.

我希望程序在第一个并行任务完成后继续(可能通过回调),而不是全部.所以我不认为天真

async.parallel([task1, task2], callback)
Run Code Online (Sandbox Code Playgroud)

适合我.

或者,我可以生成两个任务并取消不完整的任务,但我也无法弄清楚如何使用异步.

谢谢!-Charlie

Dan*_*iel 6

平行竞赛

您可以async通过返回一个error评估为true但实际上不是错误的方式来启动最终回调.

我把一个-1用作错误代码的例子放在一起.在最后的回调中,我检查了error值,如果不是,-1那么这是一个实际的错误.如果错误值是,-1那么我们将有一个有效值results.此时,我们只需要从results尚未完成的其他异步函数中删除额外的元素.

在下面的例子中,我使用request模块来拉取html页面和underscore模块来过滤最终回调中的结果.

var request = require('request');
var _ = require('underscore');

exports.parallel = function(req, res) {
  async.parallel([
    /* Grab Google.jp */
    function(callback) {
      request("http://google.jp", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        callback(-1,"google.jp");
      });
    },
    /* Grab Google.com */
    function(callback) {
      request("http://google.com", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        callback(-1,"google.com");
      });
    }
    ],
    /* callback handler */
    function(err, results) {
      /* Actual error */
      if(err && err!=-1) {
        console.log(err);
        return;
      }
      /* First data */
      if(err===-1) {
        /*
         * async#parallel returns a list, one element per parallel function.
         * Functions that haven't finished yet are in the list as undefined.
         * use underscore to easily filter the one result.
         */
        var one = _.filter(results, function(x) {
          return (x===undefined ? false : true);
        })[0];
        console.log(results);
        console.log(one);
        res.send(one);
      }
    }
  );
};
Run Code Online (Sandbox Code Playgroud)

剩余的功能结果

当您设置async#parallel为这样工作时,您将无法访问其他异步函数的结果.如果您只对第一个回复感兴趣,那么这不是问题.但是,您将无法取消其他请求.这很可能不是问题,但可能是一个考虑因素.