为什么将javascript承诺传递给`then`会导致奇怪的行为?

时间:2016-01-23 07:14:44

标签: javascript promise ecmascript-6 es6-promise

es6 specification中,它表示将不可调用传递给承诺then将会在履行承诺后设置承诺"处理器进入"身份"。在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"。我在哪里误解了规范?

1 个答案:

答案 0 :(得分:2)

根据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的原因。

相关问题