簡體   English   中英

JavaScript ES6承諾

[英]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)});

如果你要總結這個選項,你會說它是:

在序列中鏈接,帶參數傳遞。


其他說明:

  1. 如果doSomethingElse()返回一個promise,那么只有Options 1和4會將該promise添加到鏈中(因為它們是從.then()處理程序返回promise的唯一選項)所以鏈將等待該promise的解析。

  2. 在選項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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM