我要嵌套Promise,必须知道嵌套的Promise是被拒绝的Promise还是已实现的Promise,才能知道是否触发外部Promise链的捕获。为了区分嵌套的Promise是否被拒绝或实现,我在嵌套的Promise的throw
中使用catch
表示拒绝;而当嵌套的Promise的throw
中没有catch
时,总是表示满足。请看下面的例子:
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的throw
块中catch
的含义。以上是指示嵌套的Promise失败的标准方法,还是有替代的更清洁的方法来实现我想要的?如您所见,我实际上在嵌套的Promise中两次throw
表示拒绝。有什么办法可以一次throw
并表示承诺拒绝?
编辑
我在内部Promise和外部Promise中使用catch
块的原因:我想检测内部Promise中的错误,并说检测是通过内部Promise完成的catch
块;我想使用相同的处理程序来处理内部Promise或外部Promise中可能发生的错误,这是使用我的外部catch
块完成的。因为catch
-位于我的内部Promise return
中,被认为已满足我的外部Promise的then
块,所以我决定在内部{{1}中使用throw
}块,如果到达内部catch
块,则表示它实际上未满足。我还编辑了代码,以指示我的内在Promise中发生的错误不是由我catch
插入代码中不是手动触发。
答案 0 :(得分:2)
我认为执行此操作的干净方法是使用异步/等待。但是在去那里之前,您的问题是当内部承诺失败时如何不运行外部承诺吗?
以下示例:
const fun42 = () => {
return new Promise((resolve, reject) => {
setTimeout(() =>{
resolve(42)
reject('something at fun 42 went wrong')
}, 500)
})
}
const fun32 = () => {
return new Promise((resolve, reject) => {
setTimeout(() =>{
//resolve(32)
reject('something at fun 32 went wrong')
}, 500)
})
}
fun32().then(x => {
console.log(x)
return fun42()
}).then( y => {
console.log(y)
}).catch (e => {
console.log(e)
})
答案 1 :(得分:2)
嗯,这是设计问题。错误处理应该在每个级别上的一个地方进行(就像您在示例中所做的那样)。嵌套catch函数处理错误,以决定是应传播还是应悄悄完成(如您所写的)。
在该特定示例中,除了抛出错误之外,我将使用包装的Promise的reject
函数拒绝它。