Promise 和 Promise.all(array) 在数组满足之前执行[重复]

2024-01-09

The Promise.all(arr).then回调在数组完成之前执行,因此它不会捕获其元素。我怎样才能正确地做到这一点?

var arr = [];

for (var i = 0; i < 2; i++) {
  arr.push((function() {
    new Promise(function(resolve, reject) {
      setTimeout(function() {
        console.log("Resolved!");
        resolve();
      }, 3000);
    });
  })());
}

Promise.all(arr).then(function() {
  console.log("Done");
});

我的预期结果是:

Resolved!
Resolved!
Done

但真实的结果是:

Done
Resolved!
Resolved!

上面的代码只是一个例子。我更改了如下结构,代码不再有问题,但我应该使用for循环和push因为我的应用程序结构。

var p1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    console.log("Resolved #1");
    resolve();
  }, 1000);
});
var p2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    console.log("Resolved #2");
    resolve();
  }, 2000);
});
var arr = [p1, p2];

Promise.all(arr).then(function() {
  console.log("Done");
});

As 格奥尔格说 https://stackoverflow.com/questions/36616351/javascript-promise-and-promise-allarray-executed-before-array-fulfilled/36616458#comment60829165_36616351,你只是没有兑现承诺arr,因为你永远不会从你包裹的匿名函数中返回任何东西new Promise。该功能也是完全没有必要的,所以:

var arr = [];

for (var i = 0; i < 2; i++) {
  arr.push(new Promise(function(resolve, reject) {
    setTimeout(function() {
      log('resolved !');
      resolve();
    }, 500);
  }));
}

Promise.all(arr).then(function() {
  log("Done");
});

function log(msg) {
  var p = document.createElement('p');
  p.appendChild(document.createTextNode(msg));
  document.body.appendChild(p);
}

如果该函数存在,那么您可以捕获当时的值i,只要确保你返回承诺:

var arr = [];

for (var i = 0; i < 2; i++) {
  arr.push(function(index) {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        log('resolved with ' + index + ' !');
        resolve(index);
      }, 500);
    });
  }(i));
}

Promise.all(arr).then(function() {
  log("Done");
});

function log(msg) {
  var p = document.createElement('p');
  p.appendChild(document.createTextNode(msg));
  document.body.appendChild(p);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise 和 Promise.all(array) 在数组满足之前执行[重复] 的相关文章

随机推荐