Javascript 为什么在JS中使用异常来拒绝承诺?

Javascript 为什么在JS中使用异常来拒绝承诺?,javascript,promise,Javascript,Promise,我指的规格在 使用then()时,可以返回承诺,并在需要时拒绝承诺,也可以抛出异常以拒绝承诺 为什么api没有设计成这样一种方式,对于then函数,它像最初的promise构造函数一样被传递一个resolve and reject函数 异常在许多语言中都很严重(我假设在javascript中也是如此),所以他们使用异常作为流控制的选择似乎很奇怪。创建一个全新的promise对象并返回它(只是为了拒绝它)会增加IMO的代码膨胀。在抛出异常的情况下(例如语法错误,或者在未定义的对象上调用函数等),调

我指的规格在

使用
then()
时,可以返回承诺,并在需要时拒绝承诺,也可以抛出异常以拒绝承诺

为什么api没有设计成这样一种方式,对于
then
函数,它像最初的promise构造函数一样被传递一个resolve and reject函数

异常在许多语言中都很严重(我假设在javascript中也是如此),所以他们使用异常作为流控制的选择似乎很奇怪。创建一个全新的promise对象并返回它(只是为了拒绝它)会增加IMO的代码膨胀。在抛出异常的情况下(例如语法错误,或者在未定义的对象上调用函数等),调试也会变得更加困难

为什么api没有设计成这样的方式,对于then函数,它会像最初的promise构造函数一样被传递一个resolve and reject函数

实际上,该规范中的API在各种实现中形成了共识。然而,可能导致这种情况的一些要点是:

  • 那么
    是一种相当实用的方法。它的回调只应接收一个数据参数,即承诺的结果值
  • 将附加的
    resolve
    /
    reject
    函数传递给回调函数对于多个参数甚至变量函数都不起作用
  • 然后
    通常用作普通映射函数。只需
    返回
    新值,不需要
    解析
  • 当您确实希望在回调中执行异步操作时,您可以使用
    resolve
    /
    reject
    ,您最好还是使用一个承诺,然后您就可以返回它
我曾经用可选的
resolve
/
reject
参数实现了一个Promise库,但是使用起来很乏味,而且我很少需要它们,因为#4。使用它们很容易出错,您可能很容易忘记一些事情(比如处理错误或进度事件)——就像那些手动构建并返回从承诺回调中解决的延迟的人,而不是调用
然后调用

异常非常严重,所以他们使用异常作为流控制的选择似乎很奇怪

它们实际上并不用于控制流(如分支、循环等),而是用于异常处理:。大多数Promise开发人员希望将其作为同步(阻塞)代码的替代方案来实现,因为IO总是抛出异常,所以他们对此进行了调整。拒绝仍然被解释为异步等价于
try…catch
,尽管它们的一元特性可以在更强大的方式和更高级别的应用中得到利用

创建一个全新的promise对象并返回它,只是为了拒绝它,这会增加IMO的代码膨胀

返回新的拒绝承诺(…)
返回拒绝(…)
抛出错误(…)
之间没有太大区别

在抛出异常的情况下(例如语法错误,或者在未定义的对象上调用函数等),调试也变得更加困难

大多数Promise开发人员似乎认为这是一个优势,实际上-(即使在异步代码中,意外的)异常也会被自动捕获,因此它们可以被处理,而不是破坏程序(未被注意到)。另请参见和。

拒绝承诺不必抛出异常,但如果抛出异常,则结果是拒绝。tl;dr:您不希望编写现在同时处理抛出的异常和承诺拒绝的代码,所有这些都应该在
.catch()
中处理。与1通道错误处理相比,2通道错误处理具有更高的性能,并且与回调相比具有巨大的优势