处理承诺错误的最佳方法是什么?

时间:2017-07-20 15:18:22

标签: javascript angular typescript promise es6-promise

我有一个配置加载函数,可以从json文件加载一些数据并用它解析一个promise。

当我调用load函数时,我想知道处理错误的更好方法是什么。根据我的理解,可以有两种选择。

public config: any = this.configProvider.load()
    .then(data => this)
    .then(error => console.error(error));

public config: any = this.configProvider.load()
    .then(data => this)
    .catch(function(err){
        console.log(err);
    }

3 个答案:

答案 0 :(得分:2)

此代码不正确:

public config: any = this.configProvider.load()
    .then(data => this)
    .then(error => console.error(error));

它不会发现任何错误。错误是被拒绝的承诺。你需要的是:

public config: any = this.configProvider.load()
    .then(data => this, error => console.error(error))

将捕获被拒绝的promises的函数作为第二个参数传递。

但使用catch的方法对我来说更具可读性和直观性:

public config: any = this.configProvider.load()
    .then(...)
    .then(...)
    .then(...)
    .catch(function(err){
        console.log(err);
    }

但您可以通过以下方式实现相同目标:

public config: any = this.configProvider.load()
    .then(...)
    .then(...)
    .then(..., function(err){
        console.log(err);
    });

答案 1 :(得分:1)

.catch是个不错的选择。

.catch从加载json / invalid json的过程中捕获错误,无论是否发生错误都会执行double .then。因此,如果没有错误,第二个.then仍将执行

答案 2 :(得分:0)

他们都实现了记录错误的相同目标。但是,当您单步执行箭头功能时,上下文不会更改。 this的值将在function块内更改。例如,如果您需要使用与包含函数的对象关联的键,最好使用function块,因为您可以使用this关键字引用封闭对象。 另外,据我所知,使用链末尾的.catch将捕获在此之前在promise链中遇到的任何错误。但是,使用.then将捕获前一个.then块的错误,而不是之前的错误。