ES6 Promises.all() 不全部执行(promises 中没有捕获到错误)

ES6 Promises.all() does not execute all (no error caught in promises)

我正在尝试创建一个 Promise 数组,它会在实现时向控制台打印一条消息。但是,即使数组中有 10 个 promise 对象,它似乎也只打印一次。

我已经尝试过 中的解决方案 但它仍然不起作用。

function fillArrayWithPromise(promise, numTimes) {
  let promiseArr = Array(numTimes).fill(promise);
  console.log(promiseArr.join("-"));
  return promiseArr
}

var sendStuffB = new Promise(
  function(resolve, reject) {
    try {
      console.log("submitted one req");
    } catch (error) {
      console.log("Error: " + error);
    }
  }
)

let testA = fillArrayWithPromise(sendStuffB, 10);

Promise.all(
  testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
  console.log("End");
});

我希望控制台打印 10 次 "One object sent",但它只打印到控制台一次,然后无限期地继续 运行。

这是错误日志: 运行 测试脚本... 已发送一个对象 提交了一个请求 [对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]

您没有在 promise 中调用 resolve 函数,因此它们永远不会完成。尝试这样做:

var sendStuffB = new Promise(
  function(resolve, reject) {
    try {
      console.log("submitted one req");
      resolve();
    } catch (error) {
      console.log("Error: " + error);
      reject(error);
    }
  }
)

因为sendStuffB只有一个promise,所以只resolve一次。数组中的所有其他项目都引用同一个已解决的承诺。

取而代之的是,在 fillArrayWithPromise 函数中,传递一个 returns 承诺的函数,并为每个数组项分别调用该函数。

此外,永远记得根据需要在 promise 构造函数中解析或拒绝 promise。

function fillArrayWithPromise(promiseFn, numTimes) {
  let promiseArr = Array(numTimes).fill(promiseFn).map(fn => fn()); //see this
  return promiseArr
}

var sendStuffB = () => new Promise(  // converted to function
  function(resolve, reject) {
    try {
      console.log("submitted one req");
      resolve(); // remember to resolve
    } catch (error) {
      console.log("Error: " + error);
      reject(error); // reject
    }
  }
)

let testA = fillArrayWithPromise(sendStuffB, 10);

Promise.all(
  testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
  console.log("End");
});

这是 Promise.all 功能的一个基本示例。

可能对你有帮助。

const delayArray = [1000,1500,2000];

const promises = delayArray.map((item) => {
  return new Promise((resolve,reject) => {
    setTimeout(()=>{
      console.log('I was resolved in' + item + 'ms');
      resolve('Resolved' + item + 'ms');
    },item);
  });
});

Promise.all(promises)
.then((values) => console.log(values));