如何取得promise的值?
P粉116631591
P粉116631591 2023-08-21 13:47:33
0
2
462
<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>
P粉116631591
P粉116631591

全部回覆(2)
P粉616111038

當一個promise被解決/拒絕時,它會呼叫它的成功/錯誤處理程序:

var promiseB = promiseA.then(function(result) {
   // 用result做一些事情
});

then方法也傳回一個promise:promiseB,它將根據promiseA的成功/錯誤處理程序的回傳值來解決/拒絕

promiseA的成功/錯誤處理程序可以傳回三個可能的值,這些值將影響promiseB的結果:

  1. 不回傳任何值 → promiseB立即解決,並且undefined被傳遞給promiseB的成功處理程序
  2. 傳回一個值 → promiseB立即解決,並且該值被傳遞給promiseB的成功處理程序
  3. 回傳一個promise → 當promise解決時,promiseB將會解決。 當promise被拒絕時,promiseB將被拒絕。傳遞給promiseB的then處理程序的值將會是promise的結果

有了這個理解,你可以理解下面的內容:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

then呼叫立即返回promiseB。

當promiseA被解決時,它將結果傳遞給promiseA的成功處理程序。

由於傳回值是promiseA的結果 1,成功處理程序傳回一個值(上面的選項2),因此promiseB將立即解決,並且promiseB的成功處理程序將被傳遞promiseA的結果 1。

P粉155128211

promiseAthen函數傳回一個新的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上下文產生的值。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板