我的问题很简单。 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);
});
}
使用此功能,如果Promise
的{{1}}之一被拒绝,我想拒绝一个错误。
实际上,我有 “无法处理拒绝” 错误,我认为是因为这一点。所以,我正在尝试其他方法。
queue
此更改后,我再次遇到此问题,但是我认为第二种方法是正确的,但我不知道为什么它不起作用。
谢谢您的时间。
答案 0 :(得分:1)
问题出在你的
return Promise.reject(err);
在两个摘要中均。这样会导致拒绝的Promise整个问题都解决了,并且如果未在任何地方处理该拒绝,您将收到“未处理的拒绝”警告。
如果simpleFunction
的使用者需要使用Promise,请确保它也捕获了该承诺,并确保return
进行Promise.all
调用。
您无需将Promise.all
调用包装在.then
和catch
中,只需返回Promise.all
本身即可。这将创建一个Promise,它会拒绝数组中的任何Promises拒绝,这就是您想要的:
function simpleFunction() {
let queue = [];
queue.push(*PROMISE1*);
queue.push(*PROMISE1*);
queue.push(*PROMISE1*);
return Promise.all(queue);
}
simpleFunction()
.catch((err) => {
// handle errors
});
或者,如果消费者不使用Promise,则.catch
中的simpleFunction
,但不要创建被拒绝的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
});
}