如果你在承诺中有一个承诺,你需要两个陷阱吗?



例如,使用fetch()进行两次调用(第二个在 .then(( 内部(,您需要两个.catch()还是只需要外部一个就足够了?

我试图复制,但到目前为止还不能。

b = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Solving...');
resolve('solved');
}, 3000);
})
.then(() => {
new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Rejecting...');
reject('error');
}, 1000);
})
.then(() => null)
.catch((error) => {
console.log('Catching error inside.');
console.log(error);
});
})
.catch((error) => {
console.log('Catching error outside.');
console.log(error);
});

这有效,但是如果我删除内部catch()则会出现Unhandled promise rejection错误

Solving...
Rejecting...
(node:73650) UnhandledPromiseRejectionWarning: error
(node:73650) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:73650) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

您需要以then块的形式返回承诺,以便能够在一个链中catch它们:

b = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Solving...');
resolve('solved');
}, 3000);
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Rejecting...');
reject('error');
}, 1000);
});
})
.then(() => null)      // You can get rid of this if you don't have anything to do here
.catch((error) => {
console.log('Catching error outside.');
console.log(error);
});

这也应该是首选方式。像代码示例中那样使用嵌套链接将使代码非常难以阅读。

不需要多个 catch((。 如果检测到任何错误,则转到 catch((

最新更新