【问题标题】:Why passing javascript promise to `then` results in strange behavior?为什么将 javascript 承诺传递给 `then` 会导致奇怪的行为?
【发布时间】:2016-01-23 07:14:44
【问题描述】:

es6 specification 中指出,将不可调用传递给promise then 会将promise “已完成”处理程序设置为“身份”。在规范的another section 中,声明“身份”是一个计算给定值的函数。根据什么规范说我假设这个代码:

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

等于这个代码:

Promise.resolve("foo").then(v => Promise.resolve("bar")).then(v => console.log(v))

但是如果两个代码示例都在最新的 Chrome 或 Firefox 中执行,第一个输出“foo”,第二个输出“bar”。我在哪里误解了规范?

【问题讨论】:

  • 您混淆了将承诺传递给then(您的第一个示例)与传递返回承诺的函数(您的第二个示例)。第一个根据规范什么都不做,因为then 忽略所有非函数参数。

标签: javascript promise ecmascript-6 es6-promise


【解决方案1】:

根据 ECMAScript-6 的 this section

如果 [[Handler]] 是 "Identity",则它等效于仅返回其第一个参数的函数。

因此,您可以将Identity 视为以下箭头函数

(first) => first

所以,你的承诺链

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

实际上变成了

Promise.resolve("foo").then((first) => first).then(v => console.log(v))

这就是你收到foo的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2011-06-07
    • 1970-01-01
    • 2020-01-23
    • 2021-10-14
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多