我有一个配置加载函数,可以从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);
}
答案 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
块的错误,而不是之前的错误。