【问题标题】:i need to returns a `Promise` that is fulfilled when all promises in `input` * are settled (meaning, either resolved or rejected) [duplicate]我需要返回一个“承诺”,当“输入”中的所有承诺*都已解决(意思是解决或拒绝)时,该承诺已实现[重复]
【发布时间】:2017-12-19 19:44:26
【问题描述】:

promiseSettle 必须返回一个Promise,当input 中的所有promise 都已解决(即解决或拒绝)时,该Promise 会被履行。

实现值将是一个对象数组,每个对象都具有以下签名:

  • @typedef {Object} 结算
  • @property {boolean} isFulfilled - 承诺是否已解决
  • @property {boolean} isRejected - 承诺是否被拒绝
  • @property {*=} 值 - 用于解决承诺的值(如果有)
  • @property {*=} 原因 - 拒绝承诺的原因(如果有)
  • @param {Array.>} 输入 - Promises 数组
  • @return {承诺。>}

    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])
    

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

【问题讨论】:

  • 你的代码没有意义。像这样:for(let i =0;i{ 甚至不是有效代码。请清理干净。
  • 这是你的意思吗? stackoverflow.com/q/31424561/125981
  • "settle" 听起来您可能还涉及其他未标记的内容?还是只是混搭的 sudo 代码?
  • @Intervalia:你能帮忙解决一下吗?我已经把它清理干净了。谢谢。

标签: javascript ecmascript-6


【解决方案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);
  }
);

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2021-05-25
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2023-03-26
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多