另一个函数错误调用回调函数后,async.parallel的函数正在工作,为什么?

时间:2018-11-21 18:22:12

标签: node.js asynchronous

我正在学习异步库,只是自己尝试了一些代码,而我却发出了无法处理的问题,请您看一下下面的代码:)

    async.parallel([
    function (cb) {
        setTimeout(() => {
          let a = "asd";

          console.log("AAA");
          cb(a, null);

        }, 2000);
    },
    function (cb) {
      setTimeout( () => {
        let b = "dasd";

        console.log("BBBBB");
        cb(b, null);
      }, 5000);
    }
  ], function (error, results) {
    console.log("CCC");

    console.log("Errors: " + error);
    console.log("Results: " + results);
  });

我以为BBB不应输出到屏幕,但令我惊讶的是,您能帮助我理解为什么吗?

1 个答案:

答案 0 :(得分:2)

您正在使用async.parallel()。所有异步任务都将在不等待的情况下执行,并且不能保证执行顺序。

以下是脚本执行方式的详细信息:

  1. 同时设置了setTimeout()
  2. 2000毫秒后,调用了console.log("AAA")cb(a, null)
  3. cb(a, null)出错。这样便调用了主回调,并且async.parallel()结束了。
  4. 但是故事还没有结束。第二个setTimeout()已设置。调用主回调不会清除超时。
  5. console.log("BBBBB")cb(b, null)被调用。这就是为什么您看到输出BBBBB的原因。
  6. 因为已经调用了主回调,所以调用cb(b, null)不会做任何事情。