【问题标题】:Breaking a promise chain打破承诺链
【发布时间】:2020-02-23 22:28:59
【问题描述】:

我正在使用 axios 响应拦截器,在我取消请求后,我需要中断承诺链。我不想为我的应用程序中的所有请求添加取消请求的错误检查。我试过蓝鸟,但似乎只是取消承诺,而不是断链。 我必须在第一次捕获时处理错误。此图显示了一般问题。最新的 then 和 catch 位于不同的文件中。

Promise
.then((response) => {

)
.catch((error) => {
  // break promise here
})
.then((response) => {
 // skip
 // I don't want any extra checks here!
)
.catch((error) => {
  // skip
  // I don't want any extra checks here!
})

【问题讨论】:

  • @Liam 我知道,这就是为什么我试图找到任何可以做到这一点的图书馆。我需要通过各种方式克服这个问题,因为我必须向最新的 catch(在许多文件中)添加相同的错误处理。
  • @Liam - 你关于在承诺链上只有一个 .catch() 的说法绝对不正确。您可以拥有任意数量的。而且,在 .catch() 内,您可以重新抛出,然后代码将命中链中的下一个 .catch()。或者,您可以返回一个值,它将命中链中的下一个 .then(),这可能会拒绝导致它在此之后命中下一个 .catch()。您可以在承诺链中多次执行此操作。
  • SO Promise question。关于 then/resolve/reject 的有趣、详细的讨论。还可以深入了解自始至终提供的链接。在我看来,任何给定的.then 都可以对其调用.then 的状态作出反应并做出相应的反应——即,如有必要,立即return;注意.then() 有 2 个参数。最终,“主”Promise 调用它的“解析器”,如果您将其作为 Promise 构造函数参数提供,它会根据.then 链设置的状态执行任何操作。

标签: javascript promise axios es6-promise bluebird


【解决方案1】:

另一种选择是抛出一个自定义错误,该错误可以在最后的单个 catch 块中捕获,如下所示:

const errorHandler = require('path/to/handler')
class ProcessingError1 extends Error {
    constructor(message) {
        super(message);
        this.name = "ProcessingError1";
    }
}
class ProcessingError2 extends Error {
    constructor(message) {
        this.message = message;
        this.name = "ProcessingError2";
    }
}
const process1 = async () => {
    throw new ProcessingError1("Somethign went wrong");
};
const process2 = async () => {
    return { some: "process" };
};
const someApiCall = async () => ({ some: "response" });

someApiCall()
    .then(process1)
    .then(process2) // process2 is not run if process1 throws an error
    .catch(errorHandler);
// ErrorHandler.js

module.exports = e => {
        if (e instanceof ProcessingError1) {
            // handle error thrown from process1
        }
        else if (e instanceof ProcessingError2) {
            // handle error thrown from process2
        }
        else {
            // handle other errors as needed..
        }
    }

【讨论】:

  • 问题是我必须在几十个文件中添加这个错误处理并且代码是一样的。这就是我要避免的。
  • 只有从另一个文件导入的catch代码?
  • 我刚刚更新了我的示例,以展示如何导入错误处理以防止重复
  • 好的。在目前的情况下,这似乎是唯一的选择。谢谢
【解决方案2】:

最后只保留一个 catch 块来收集你的 Promise 链触发的所有错误。

如果一个promise在链中抛出以下不被执行

Promise
.then((response) => {

)
.then((response) => {
 // skip
 // I don't want any extra checks here!
)
.catch((error) => {
  // skip
  // I don't want any extra checks here!
})

【讨论】:

  • 对我不起作用。我已经编辑了帖子以使其更清晰。
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2015-08-21
相关资源
最近更新 更多