【问题标题】:How can I return a Promise from a catch and then reject to next catch?如何从捕获中返回 Promise 然后拒绝下一个捕获?
【发布时间】:2019-11-21 11:29:37
【问题描述】:

我有一个捕捉错误的承诺链,应该在那个捕捉中执行另一个异步操作(返回一个承诺),然后应该去最后一个捕捉,但我不知道该怎么做

const roses_color = "blue"

new Promise((resolve, reject) => {
    (roses_color === "red") ? resolve("are") : reject("are not")
})
.then((result) => 
    new Promise((resolve, reject) => {
        setTimeout(() => resolve(`Roses ${result} red`), 1000)
    })
)
.catch((error) => promiseWhichWillResolve())
.then((result) => res.send(`This is true: ${result}`))
.catch((error) => res.send(`ERROR: ${error}`))

这个的输出是

最终结果:玫瑰不是红色的

我希望第一个捕获返回 promiseWhichWillResolve 但不知何故而不是去最后一个'then'它应该去最后一个'catch'。

如果我只是使用

.catch((error) => {
    promiseWhichWillResolve())
    throw error
}

这将导致 promiseWhichWillResolve 不被等待。

我该怎么做?

【问题讨论】:

  • 我认为你不能在.catch 之后再做一个.then,也许可以尝试修改你的案例顺序。

标签: javascript asynchronous ecmascript-6 promise


【解决方案1】:

我刚刚意识到有一种非常简单的方法可以做到这一点,即在第一个 catch 中使用 async/await。这将确保异步操作完成然后抛出去最后一个捕获。

const roses_color = "blue"

new Promise((resolve, reject) => {
    (roses_color === "red") ? resolve("are") : reject("are not")
})
.then((result) => 
    new Promise((resolve, reject) => {
        setTimeout(() => resolve(`Roses ${result} red`), 1000)
    })
)
.catch(async (error) => {
    await promiseWhichWillResolve()

    throw `Roses ${error} red`
})
.then((result) => res.send(`This is true: ${result}`))
.catch((error) => res.send(`ERROR: ${error}`))

输出

错误:玫瑰不是红色的

【讨论】:

    【解决方案2】:

    试试下面的。

    .catch((error) => promiseWhichWillResolve().then(() => Promise.reject(error)));
    

    【讨论】:

    • 你不应该嵌套 then/catch
    • @RedKnight91 因为你在 catch 中使用 promiseWhichWillResolve 函数,如果它成功解决,它将进入下一个,所以我们应该在 promiseWhichWillResolve 函数中切断承诺链
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2019-08-10
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2016-06-21
    相关资源
    最近更新 更多