[英]ES6 promises - can somebody explain this piece of promises code?
有人可以解釋下面的代碼如何工作嗎?
var a = () => {
return Promise.resolve('aaa');
};
var b = () => {
return Promise.resolve('bbb');
};
a()
.then(() => { b() })
.then(console.log); // logs undefined
a()
.then(b())
.then(console.log); // logs aaa
a()
.then(b)
.then(console.log); // logs bbb
我想知道在單個諾言上執行多個.then的順序,以及b()vs b vs諾言()=> {b()}如何使輸出有所不同。
Secnario答:你的第一個不從返回任何東西.then()
處理程序(沒有return
內聲明{}
和箭頭的功能時,有不使用隱式返回{}
所以從返回的值.then()
處理函數undefined
,這就是您要記錄的內容。
.then(() => { b() })
必須是以下任意一項才能正常工作:
.then(() => { return b() }) // since there are {}, you must have an actual `return`
.then(() => b()) // use implicit return in arrow function
.then(b) // just pass function reference directly
方案B:第二個方案過早調用b()
並將返回值從b()
傳遞到您的.then()
處理程序。 .then()
處理函數期望將函數引用傳遞給他們,而不是promise,因此他們不使用您傳遞給他們的promise(它們會忽略它,因為它不是函數引用)。 記住.then(b())
將首先執行b()
,然后將其返回值傳遞給.then()
。 那顯然不是您想要的,也不是.then()
設計要使用的。 有關更多信息,請參見下面的Promise規范詳細信息。
方案C:第三個正確地將指向b
的函數引用傳遞給.then()
處理程序,因此它是唯一正確鏈接了兩個promise的函數。
方案B的Promise規范說明
在第二種情況下,您將像.then(somePromise)
一樣將諾言傳遞給.then(somePromise)
.then()
處理程序。 .then()
規范非常清楚地指出,必須向.then()
傳遞可調用的內容(這意味着函數引用)。 當您不傳遞函數引用時,傳遞的任何內容都將被忽略,並且先前解析的值(在您的情況下為aaa
)將沿着鏈向下傳遞。 這是promise規范涵蓋的內容:
在25.4.5.3中 ,有.then .then()
的規范。
最后調用PerformPromiseThen()
,這是下一部分25.4.5.3.1
該部分說明,如果onFulFilled
參數是不可調用的(例如,不是函數引用),則將替換“ Identify”。
在文檔中進一步查看時, 第25.4.1.2節中定義了“身份”
應該應用於傳入值的函數,其返回值將控制派生的promise發生了什么。 如果[[Handler]]為“ Identity”,則等效於僅返回其第一個參數的函數。
這意味着將忽略作為onFulFilled參數傳遞的任何內容,並忽略一個身份函數(該函數將返回傳遞給它的第一個參數)。 在您的情況下,第一個參數是您的第一個promise的解析值aaa
因此這就是您在第二種情況的日志中看到的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.