【发布时间】:2019-05-08 06:25:22
【问题描述】:
我正在嵌套 Promise,我必须知道嵌套的 Promise 是被拒绝的 Promise 还是已完成的 Promise 才能知道是否触发外部 Promise 链的捕获。为了区分嵌套的 Promise 是否被拒绝或履行,我在嵌套的 Promise 的 catch 中使用 throw 来表示拒绝;而当我的嵌套 Promise 的 catch 中没有 throw 时,总是会指示实现。请看下面的例子:
let test = new Promise((resolve, reject) => {
resolve(42);
}).then((e) => {
console.log(e);
return new Promise((resolve, reject) => { //Error happens inside this nested Promise
resolve(32);
}).then((e) => {
console.log(e);
//Run other processes that may lead to an error
}).catch((e) => { //I added this catch block for error detection, whatever error it might be
console.log(e);
throw(e); //I'm throwing (e) from the inner Promise's catch so that the returned Promise in the outer then is a rejected Promise, which will be "caught" by the catch block of the outer Promise
});
}).catch((e) => {
console.log(e); //I handle error that happen may either in the inner Promise or the outer Promise here
});
上面显示了我在嵌套 Promise 的 catch 块中所说的 throw-ing 的意思。以上是指示嵌套 Promise 失败的标准方法,还是有另一种更清洁的方法来实现我想要的?如您所见,我实际上在嵌套的 Promise 中使用了两次 throw-ing 来表示拒绝。有没有办法让我可以throw 一次并表示 Promise 拒绝?
编辑
我在我的内部 Promise 中使用 catch 块的原因和我的外部 Promise:我想检测我的内部 Promise 中的错误,并且说检测是使用我的内部 @987654331 完成的@ 堵塞;我想使用相同的处理程序处理内部 Promise 或外部 Promise 中可能发生的错误,这是使用我的外部 catch 块完成的。因为catch-ing 在我的内部 Promise returns 中是一个 Promise,它被认为已满足我的外部 Promise 的 then 块,所以我决定在我的内部 catch 块中使用 throw 来表明它实际上 如果到达内部 catch 块,则不满足。我还编辑了我的代码,表明我的内部 Promise 中发生的错误不是由我在代码中throw-ing 手动触发的。
【问题讨论】:
-
为什么在嵌套的 promise 中使用 catch/throw 块?这是多余的。如果您不希望您的内部承诺被拒绝或让您的顶级承诺完成工作,请使用 catch
-
@AndreiBelokopytov 并非总是如此,但在任何级别的一个地方处理错误是一个很好的设计。这取决于场景。想象一下,您想记录错误,更改该特定错误的某些状态 - 最好将它放在一个地方(想象嵌套的 Promise 作为其他模块的函数使用)。
-
@tomericco 谢谢。那么在您看来,在任何级别的一个地方处理错误并通过在我的内部 Promise
catch块中使用throw来指示嵌套的 Promise 被拒绝是一种好习惯吗? -
@tomericco 我同意你关于错误处理的观点,但你的例子恰恰相反。你在内部promise中处理了错误,为什么需要抛出它?如果你想处理外部代码中的错误,那么你不需要在内部 Promise 中使用 catch 块。
-
你应该使用 return Promise.reject(new Error('error')) 而不是 throw('error')。如果你使用 Promise,你应该使用 Promise 函数,因为它们完全是为 Promises 制作的,没有意外的交互。
标签: javascript promise es6-promise