我需要返回一个`Promise`,当`input` *中的所有promise都被解决时(意味着,要么被解决要么被拒绝),它就会被实现[复制]

问题描述 投票:-4回答:1

这个问题在这里已有答案:

promisesettle必须返回Promise,当input中的所有承诺都已解决时(意味着,要么已经解决,要么被拒绝)。

履行值将是一个对象数组,每个对象具有以下签名:

  • @typedef {对象}结算
  • @property {boolean} isFulfilled - 承诺是否已解决
  • @property {boolean} isRejected - 承诺是否被拒绝
  • @property {* =} value - 用于解析promise的值(如果有)
  • @property {* =} reason - 拒绝承诺的原因(如果有的话)
  • @param {Array。>}输入 - 一个Promises数组
  • @return {Promise。>} function promiseSettle(input) { let promiseArray = []; for (let i = 0; i < input.length; i++) { Promise.resolve(input[i]).then(output => { promiseArray.push(output); console.log(promiseArray); }, reason => { promiseArray.push(reason); }) } } // testing data var p1 = new Promise((resolve, reject) => { setTimeout(reject, 1, "first promise of 1 sec"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 1, "second promise of 2 sec"); }) var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 1, "rejected promise"); }) promiseSettle([p1, p2, p3])

有人可以帮忙吗?我不确定如何使用预期参数返回promise。

javascript ecmascript-6
1个回答
1
投票

这应该做到这一点。

function promiseSettle(inputList) {
  let promiseArray = inputList.map(
    input => {
      return new Promise((resolve, reject) => {
        input.then(
          value => {
            resolve({
              isFulfilled: true,
              isRejected: false,
              value
            });
          },
          reason => {
            resolve({
              isFulfilled: false,
              isRejected: true,
              reason
            });
          }

        );
      });
    }
  );
  
  return Promise.all(promiseArray);
}

// testing data
var p1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1, "first promise of 1 sec");
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2, "second promise of 2 sec");
})
var p3 = new Promise((resolve, reject) => {
  setTimeout(reject, 1, "rejected promise");
})

promiseSettle([p1, p2, p3]).then(
  promises => {
    console.log(promises);
  }
);
© www.soinside.com 2019 - 2024. All rights reserved.