【问题标题】:How to return a Promise into a Promise.all(). Promise.all() returning a Promise如何将 Promise 返回到 Promise.all()。 Promise.all() 返回一个 Promise
【发布时间】:2020-08-06 18:10:14
【问题描述】:

我的问题很简单。 Promise.all() 方法可以返回 Promise 吗? 让我解释一下:

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    Promise.all(queue)
        .then(() => return Promise.resolve())
        .catch(err => {
            return Promise.reject(err);
        });    
}

如果Promisequeue 之一被拒绝,我想通过此函数拒绝错误。 实际上,我有 "unhandle reject" 错误,我认为是因为这个。所以,我正在尝试其他方法。

async function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    try {
        await Promise.all(queue);
        return Promise.resolve();
    } catch (error) {
        return Promise.reject(err);
    }  

在这个改变之后,我又遇到了这个问题,但我认为第二种方法是正确的,但我不知道为什么它不起作用。

感谢您的宝贵时间。

【问题讨论】:

  • 所有这些都是不必要的,只需返回Promose.all返回的内容。

标签: javascript node.js promise


【解决方案1】:

问题是你的

return Promise.reject(err);

在两个 sn-ps 中。这会导致整个事情都解决为被拒绝的 Promise,如果该拒绝没有在任何地方得到处理,您将收到“未处理的拒绝”警告。

如果simpleFunction 的消费者需要使用Promise,请确保它也捕获它,并确保return 调用Promise.all

无需将Promise.all 调用包装在.thencatch 中,您可以只返回Promise.all 本身。如果数组中的任何 Promise 被拒绝,这将产生一个 Promise 拒绝,这就是您想要的:

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    return Promise.all(queue);
}
simpleFunction()
  .catch((err) => {
    // handle errors
  });

或者,如果消费者不使用 Promise,则在 simpleFunction 中使用 .catch,但是不要创建被拒绝的 Promise,只需处理错误(或在catch,虽然这不是一个好主意):

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    Promise.all(queue)
      .catch((err) => {
        // handle errors here
        // do NOT call `Promise.reject`,
        // because then the rejection will be unhandled
      });
}

【讨论】:

  • 所以。当queueend 中的所有promise 时,Promise.all() 返回一个全域语句?
  • 已完成,您的意思是?是的,Promise.all 将返回一个 Promise,它会解析一次(如果)数组中的所有 Promise 解析。如果数组中的任何 Promise 拒绝,Promise.all 也会拒绝。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2017-05-04
  • 2020-06-01
  • 2017-02-26
  • 2020-11-05
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多