P粉6161110382023-08-22 12:43:32
當一個promise被解決/拒絕時,它會呼叫它的成功/錯誤處理程序:
var promiseB = promiseA.then(function(result) { // 用result做一些事情 });
then
方法也傳回一個promise:promiseB,它將根據promiseA的成功/錯誤處理程序的回傳值來解決/拒絕。
promiseA的成功/錯誤處理程序可以傳回三個可能的值,這些值將影響promiseB的結果:
有了這個理解,你可以理解下面的內容:
promiseB = promiseA.then(function(result) { return result + 1; });
then呼叫立即返回promiseB。
當promiseA被解決時,它將結果傳遞給promiseA的成功處理程序。
由於傳回值是promiseA的結果 1,成功處理程序傳回一個值(上面的選項2),因此promiseB將立即解決,並且promiseB的成功處理程序將被傳遞promiseA的結果 1。
P粉1551282112023-08-22 00:10:42
promiseA
的then
函數傳回一個新的promise(promiseB
),在promiseA
解決後立即解決,其值是在promiseA
的成功函數中傳回的值。
在這種情況下,promiseA
解決為一個值-result
,然後立即使用result 1
的值解決promiseB
。
存取promiseB
的值與存取promiseA
的結果的方式相同。
promiseB.then(function(result) { // 这里你可以使用promiseB的结果 });
從ECMAScript 2016(ES7, 2016)開始,async
/await
在JavaScript中成為標準,它允許一種替代上述方法的語法。現在你可以這樣寫:
let result = await functionThatReturnsPromiseA(); result = result + 1;
現在沒有promiseB了,因為我們使用await
解開了promiseA的結果,而且你可以直接使用它。
然而,await
只能在async
函數內部使用。所以稍微放大一點,上述程式碼需要包含在一個函數內:
async function doSomething() { let result = await functionThatReturnsPromiseA(); return result + 1; }
需要明確的是,這個範例中doSomething
函數的回傳值仍然是promise,因為async函數傳回的是promise。所以如果你想要存取回傳值,你需要使用result = await doSomething()
,這只能在另一個async函數內部使用。基本上,在父級async上下文中,你可以直接存取子級async上下文產生的值。