【问题标题】:When is callback of Promise.all() triggeredPromise.all() 的回调何时触发
【发布时间】:2017-11-12 02:11:42
【问题描述】:

我刚刚学习了 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. 在 Promise 定义中的哪个位置触发了回调?

  3. 将什么值传递给回调?

这是我研究的代码:

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

【问题讨论】:

  • documentation 告诉你你需要知道的一切
  • 感谢@JaromandaX 我正在阅读

标签: javascript promise


【解决方案1】:

Promise.race

还有Promise.race,它会在第一个承诺(p1p2p3p4)时立即出现 resolvereject解决或拒绝

// 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
});

【讨论】:

  • 我看不出您确实有问题。我提供这个答案是因为我认为它可能对你有用^_^
【解决方案2】:
  1. 回调被触发一次。

  2. 当所有的承诺都被解决或其中一个失败时。

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

【讨论】:

  • 所以我无法想象将回调插入到定义承诺的代码中的某处吧?
  • 没有。 Promise.all() 的全部意义在于你想开始一堆事情,然后在它们都完成后做一些事情。这就是为什么它被命名为“全部”。
  • @zhangjinzhou 使用 Promise.all 的一个用例将同时运行多个数据库方法......这样您就不必等待每个完成触发下一个(也许'会帮助你理解promise.all更好)。如果我要一次添加多个数据库方法,这意味着回调方法将包含每个 db 方法的所有结果。
猜你喜欢
  • 2016-01-03
  • 2013-01-11
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多