代码之家  ›  专栏  ›  技术社区  ›  Toby Harnish

将基元传递给then处理程序

  •  2
  • Toby Harnish  · 技术社区  · 2 年前

    这是我在JS中尝试promise时所做的一个有趣的观察。请考虑以下代码:

    Promise.resolve(1).then(2).then(console.log);

    这将打印出1作为其输出。为什么本机实现的promise API没有抛出异常?当非函数参数被忽略时,“跳过”它有什么好处?我真的很想知道答案

    此帖子位于 MDN .

    1 回复  |  直到 2 年前
        1
  •  3
  •   Nicholas Tower    2 年前

    现代承诺的工作方式由 ECMAScript spec 。但是promise在作为语言的核心部分添加之前就已经存在了,因此为了向后兼容性,它们被设计为与社区构建的promise的行为相匹配。社区使用的规范称为 Promises/A+ ,而相关部分是这样的:

    2.2 then 方法

    promises-then方法接受两个参数:
    promise.then(onFulfilled, onRejected)

    2.2.1 onFulfilled和onRejected都是可选参数:
    2.2.1.1 如果onFulfilled不是函数,则必须忽略它。
    2.2.1.2如果onRejected不是函数,则必须忽略它。

    ECMAScript在其规范中继承了这种行为。该规范很难阅读,但我认为这部分来自 PerformPromiseThen

    1. 如果IsCallable(onFulfilled)为false,则
      a.让onFulfilledJobCallback为空。

    至于他们为什么选择这样设计,我不知道。