如何取得promise的值?
P粉116631591
2023-08-21 13:47:33
<p>我正在查看Angular文檔中關於<code>$q</code>的範例,但我認為這可能適用於一般的promise。下面的範例是從他們的文件中直接複製的,包括他們的註釋:</p>
<pre class="brush:php;toolbar:false;">promiseB = promiseA.then(function(result) {
return result 1;
});
// 當promiseA被解決後,promiseB會立即被解決,並且它的值將是promiseA的結果加1</pre>
<p>我不清楚這是如何運作的。如果我可以在第一個<code>.then()</code>的結果上呼叫<code>.then()</code>,將它們連結在一起,我知道我可以這樣做,那麼<code>promiseB</code>就是promise對象,類型為<code>Object</code>。它不是一個<code>Number</code>。那麼他們所說的「它的值將是promiseA的結果加1」是什麼意思? </p>
<p>我應該像<code>promiseB.value</code>這樣訪問它嗎?成功回調如何回傳一個promise並回傳「result 1」?我漏掉了什麼。 </p>
當一個promise被解決/拒絕時,它會呼叫它的成功/錯誤處理程序:
then
方法也傳回一個promise:promiseB,它將根據promiseA的成功/錯誤處理程序的回傳值來解決/拒絕。promiseA的成功/錯誤處理程序可以傳回三個可能的值,這些值將影響promiseB的結果:
有了這個理解,你可以理解下面的內容:
then呼叫立即返回promiseB。
當promiseA被解決時,它將結果傳遞給promiseA的成功處理程序。
由於傳回值是promiseA的結果 1,成功處理程序傳回一個值(上面的選項2),因此promiseB將立即解決,並且promiseB的成功處理程序將被傳遞promiseA的結果 1。
promiseA
的then
函數傳回一個新的promise(promiseB
),在promiseA
解決後立即解決,其值是在promiseA
的成功函數中傳回的值。在這種情況下,
promiseA
解決為一個值-result
,然後立即使用result 1
的值解決promiseB
。存取
promiseB
的值與存取promiseA
的結果的方式相同。從ECMAScript 2016(ES7, 2016)開始,
async
/await
在JavaScript中成為標準,它允許一種替代上述方法的語法。現在你可以這樣寫:現在沒有promiseB了,因為我們使用
await
解開了promiseA的結果,而且你可以直接使用它。然而,
await
只能在async
函數內部使用。所以稍微放大一點,上述程式碼需要包含在一個函數內:需要明確的是,這個範例中
doSomething
函數的回傳值仍然是promise,因為async函數傳回的是promise。所以如果你想要存取回傳值,你需要使用result = await doSomething()
,這只能在另一個async函數內部使用。基本上,在父級async上下文中,你可以直接存取子級async上下文產生的值。