何时回调Promise.all()触发

时间:2017-06-10 00:23:10

标签: javascript promise

我刚学会了Promise.all()的概念,并对其机制感到好奇。根据我对Promise的有限知识,它在.then()方法中传递一个回调函数,并在定义中调用它。例如:

var p = new Promise((resolve) => {
  setTimeout(resolve, 2000);
  setTimeout(() => {
    console.log('4 sec function');
  }, 4000);
});

p.then(() => {
  console.log('2 sec function');
});

// result:
// 2 sec function
// 4 sec function

但是,当我们使用Promise.all()时,它会在所有承诺都完成后触发回调。正如我的猜测,它触发了最后履行的承诺中的回调。在下面的例子中,我对结果的看法是“四”。但是,它会打印四个数字的数组。为什么会这样?更具体地说:

  1. 实际触发回调的次数是多少次?

  2. promises定义中的哪个位置是触发回调?

  3. 传递给回调的值是什么?

  4. 以下是我研究的代码:

    var p1 = new Promise((resolve, reject) => {
      setTimeout(resolve, 1000, 'one');
    });
    var p2 = new Promise((resolve, reject) => {
      setTimeout(resolve, 2000, 'two');
    });
    var p3 = new Promise((resolve, reject) => {
      setTimeout(resolve, 3000, 'three');
    });
    var p4 = new Promise((resolve, reject) => {
      setTimeout(resolve, 4000, 'four');
    });
    
    Promise.all([p1, p2, p3, p4]).then(values => {
      console.log(values);
    });

    // print:
    // one
    // two
    // three
    // four
    

2 个答案:

答案 0 :(得分:1)

  1. 回调被触发一次。

  2. 当所有承诺得到解决或其中一个失败时。

  3. 它接收所有承诺解析为的值的数组。

答案 1 :(得分:0)

<强> Promise.race

还有Promise.race,只要承诺的第一次 resolvereject p1p2p3p4)解析或拒绝

// note: i've adjusted the delays from your original code
var p1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, 'one');
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, 'two');
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'three');
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'four');
});

Promise.race([p1, p2, p3, p4]).then(fastest => {
  console.log(fastest); // four
});