搜尋

首頁  >  問答  >  主體

如何取得promise的值?

<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粉116631591P粉116631591452 天前445

全部回覆(2)我來回復

  • P粉616111038

    P粉6161110382023-08-22 12:43:32

    當一個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。

    回覆
    0
  • P粉155128211

    P粉1551282112023-08-22 00:10:42

    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上下文產生的值。

    回覆
    0
  • 取消回覆