当JavaScript类构造函数以基于承诺的方式失败时,它应该返回什么?
我试图检查构造函数中传递参数的值,然后以基于可链接承诺的方式执行某些操作。然而,我发现如果我在构造函数中使用当JavaScript类构造函数以基于承诺的方式失败时,它应该返回什么?,javascript,Javascript,我试图检查构造函数中传递参数的值,然后以基于可链接承诺的方式执行某些操作。然而,我发现如果我在构造函数中使用抛出错误,如果失败,我就不能。捕获错误。我怎样才能达到这个目标 class Car { constructor(name = '', brand = '') { if (!name || !brand) { throw new Error('Initiate error'); } this.name = name; this.brand =
抛出错误
,如果失败,我就不能。捕获错误。我怎样才能达到这个目标
class Car {
constructor(name = '', brand = '') {
if (!name || !brand) {
throw new Error('Initiate error');
}
this.name = name;
this.brand = brand;
}
beep() {
return Promise.resolve(`${this.brand}-${this.name}`);
}
}
const audi = new Car('A8', 'Audi');
audi.beep()
.then((val) => console.log(val))
const test = new Car();
test.beep()
.then((val) => console.log(val))
.catch((error) => console.log(error)); // This line didn't work, how can I get the error thrown by constructor?
当您调用Promise.resolve
或Promise.reject
时,这些方法实际上只是用于创建立即解析或拒绝的新Promise对象的辅助方法。没有理由让.catch
处理程序捕获您的错误-错误不在承诺范围内发生,因此无法知道
我建议将错误移出构造函数,并在实际检查时创建它(即在beep
中):
当您调用Promise.resolve
或Promise.reject
时,这些方法实际上只是用于创建立即解析或拒绝的新Promise对象的辅助方法。没有理由让.catch
处理程序捕获您的错误-错误不在承诺范围内发生,因此无法知道
我建议将错误移出构造函数,并在实际检查时创建它(即在beep
中):
您的构造函数与承诺无关,因此没有理由。catch
会知道它。在您调用.beep
函数之前就会抛出错误。对承诺调用.catch
只会捕获承诺本身中发生的错误(即,从不,因为你的承诺会立即解决)。@JoeClay如果我在条件表达式中使用返回承诺。拒绝('Initiate error')
,那么它将是承诺方式。但是,我将得到test.beep不是一个函数,因为它将是一个承诺。拒绝对象。我认为你根本误解了承诺的工作原理。我会写一个答案来解释。完成了!(如果你看到了我发布的答案的第一个版本,我建议你再看一看——我想出了一个更好的解决方案)@JoeClay我看到了新版本。我认为这可能比第一个版本更好!非常感谢。您的构造函数与承诺无关,因此没有理由。catch
会知道这一点。在您调用.beep
函数之前就会抛出错误。对承诺调用.catch
只会捕获承诺本身中发生的错误(即,从不,因为你的承诺会立即解决)。@JoeClay如果我在条件表达式中使用返回承诺。拒绝('Initiate error')
,那么它将是承诺方式。但是,我将得到test.beep不是一个函数,因为它将是一个承诺。拒绝对象。我认为你根本误解了承诺的工作原理。我会写一个答案来解释。完成了!(如果你看到了我发布的答案的第一个版本,我建议你再看一看——我想出了一个更好的解决方案)@JoeClay我看到了新版本。我认为这可能比第一个版本更好!非常感谢。明白了!!我想我应该在新车
之前检查值,让构造函数只需将值分配到汽车
。感谢您的解释。然后
可以简单地返回字符串。它不必是一个承诺对象。是的,我以前的答案过于复杂(在我看来,这有点屈尊)。这个在我看来更有意义。明白了!!我想我应该在新车
之前检查值,让构造函数只需将值分配到汽车
。感谢您的解释。然后
可以简单地返回字符串。它不必是一个承诺对象。是的,我以前的答案过于复杂(在我看来,这有点屈尊)。这个在我看来更有意义。
class Car {
constructor(name = '', brand = '') {
this.name = name;
this.brand = brand;
}
beep() {
return new Promise(function (resolve, reject) {
if (!this.name || !this.brand) {
reject(new Error('Initiate error'));
}
resolve();
});
}
}