ES6 Promises.all()不会全部执行(promise中没有错误)

时间:2019-06-20 07:59:39

标签: javascript node.js es6-promise

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

我已经尝试过ES6 Promises/calling a function after multiple promises are fulfilled (can't use Promises.all)中的解决方案 但它仍然不起作用。

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次“已发送一个对象”,但是只打印到控制台一次,之后可以无限期地继续运行。

这是错误日志: 正在运行测试脚本... 发送一个对象 提交了一份要求 [object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise] < / p>

3 个答案:

答案 0 :(得分:3)

由于sendStuffB仅是一个承诺,因此只能解决一次。数组中的所有其他项目均引用相同的已解决承诺。

相反,在fillArrayWithPromise函数中,传递一个返回promise的函数,并为每个数组项分别调用该函数。

此外,请始终记住根据需要在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");
});

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这是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));