2016-01-23 57 views
1

es6 specification它聲明,傳遞非可召集承諾then將承諾「履行」處理程序到「身份」。在規範的another section中指出「身份」是評估給定值的函數。根據什麼規範說我認爲這個代碼:爲什麼將javascript承諾傳遞給`then'會導致奇怪的行爲?

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 「和第二個輸出」欄「。我在哪裏誤解了規範?

+0

你將一個承諾傳遞給'then'(你的第一個例子),而不是傳遞一個返回承諾的函數(你的第二個例子)。第一個根據規範不做任何事情,因爲'then'忽略了所有非函數參數。 – 2016-01-23 07:51:50

回答

2

作爲根據ECMAScript-6的this section

如果[[處理程序]]是「同一性」它等同於簡單地返回它的第一個參數的函數。

所以,你能想到的Identity爲以下Arrow功能

(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

相關問題