[英]JavaScript ES6 promises
問題:這四個承諾有什么區別?
doSomething().then(function () { return doSomethingElse(); });
doSomething().then(function () { doSomethingElse(); });
doSomething().then(doSomethingElse());
doSomething().then(doSomethingElse);
選項1:
doSomething().then(function () { return doSomethingElse(); });
這將執行doSomething()
,然后當它結算時,它執行doSomethingElse()
並且promise鏈的解析值是doSomethingElse()
的已解析值或返回值。 沒有參數傳遞給doSomethingElse()
。
如果你要總結這個選項,你會說它是:
按順序鏈接,沒有參數傳遞。
選項2:
doSomething().then(function () { doSomethingElse(); });
與選項1相同,但undefined
promise鏈的已解析值,因為.then()
處理程序沒有返回值。 來自doSomethingElse()
任何返回值,無論是promise還是值都被忽略。
如果你要總結這個選項,你會說它是:
在序列中執行(未鏈接),沒有參數傳遞。
選項3:
doSomething().then(doSomethingElse());
這絕不是你想要的。 該執行doSomething()
然后,之前doSomething()
已經解決了,它也執行doSomethingElse()
並傳遞從返回值doSomethingElse()
的.then()
處理程序。 除非doSomethingElse()
返回一個用作.then()
處理程序的函數,否則這是一個編碼錯誤。
如果你要總結這個選項,你會說它是:
馬上執行,可能是一個Bug
選項4:
doSomething().then(doSomethingElse);
這與選項1相同,只是doSomething()
的解析值作為doSomethingElse(val)
的第一個參數傳遞。 這在結構上與此相同:
doSomething().then(function(result) { return doSomethingElse(result)});
如果你要總結這個選項,你會說它是:
在序列中鏈接,帶參數傳遞。
其他說明:
如果doSomethingElse()
返回一個promise,那么只有Options 1和4會將該promise添加到鏈中(因為它們是從.then()
處理程序返回promise的唯一選項)所以鏈將等待該promise的解析。
在選項1,2和4中,如果doSomethingElse()
拋出同步異常,那么promise鏈將被拒絕,並將異常作為原因。 在選項3中,函數在promise鏈之外執行,因此如果它拋出同步異常,它將拋出更高的范圍(類似於doSomething()
同步拋出)。
在第一種情況下,在解析doSomething()
返回的promise后,將調用回調。 回調函數可以返回另一個承諾(這就是我們稱promises為'chainable'的原因)。 在你的情況下, doSomethingElse()
應該返回另一個promise。
在第二種情況下,回調函數不會返回任何內容,因此將調用執行鏈中的下一個promise,但是使用未定義的參數。
在第三種情況下,作為doSomethingElse()
函數的結果提供了回調函數。
最后, doSomethingElse
應該是一個函數,它將在履行第一個承諾后執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.