将其扔到嵌套Promise中的一个catch块中以触发外部Promise的catch块,是否有其他更清洁的方法?

时间:2019-05-08 06:25:23

标签: javascript promise es6-promise

我要嵌套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插入代码中不是手动触发

2 个答案:

答案 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函数拒绝它。