当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();
    });
  }
}