JavaScript 之 Promise

zluotan 7年前發布 | 14K 次閱讀 Promise JavaScript開發

Promise 對象用于異步計算。一個 Promise 對象表示一個現在或者將來或者永不可用的值。

語法

new Promise(
    /** executor */
    function(resolve, reject){
        ...
    }
)

參數

  • executor:

    一個函數,該函數的參數為:resolve 和 reject。executor 函數在實現 Promise 對象時立即被調用,甚至在 Promise 的構造函數返回之前就被執行,

    resolve 和 reject 會被傳入。resolve 和 reject 都是函數,executor 通常初始化一些異步工作,之后,一旦完成,會調用 resolve 函數清理 promise,

    或者在發送錯誤時調用 reject 拒絕 promise。

描述

Promise 對象是一個 ’值‘的代理,該’值‘在 promise 對象創建時可能是未知的。它允許你為異步操作的事件結果“成功返回的值”或“失敗”綁定一個處理方法。

這使得異步方法可以像同步方法那樣返回值;不同于立即返回最終結果,異步方法返回一個 promise 對象,可以在未來提供一個值。

Promise 有以下幾種狀態:

  • pending:初始狀態,既不是 fulfilled 也不是 rejected。
  • fulfilled:表示成功完成操作。
  • rejected:表示該操作失敗。

pending 狀態的 promise 對象可以通過一個值轉換為 fulfilled 或者 rejected 狀態。當狀態發送轉換時,promise.then 綁定的方法就會被調用。

因為 Promise.prototype.then 和 Promise.prototype.catch 方法返回 promise 對象,所以它們可以被鏈式調用(一種被稱為 composition 的操作)。

屬性

  • Promise.length

    長度屬性,值為 1,構造器參數的數量。

  • Promise.prototype

    表示 Promise 構造器的原型。

方法

  • Promise.all(iterable)

    這個方法返回一個新的 promise 對象,該 promise 對象在 iterable 里所有的 promise 對象都成功的時候才會觸發成功,

    一旦有任何一個 iterable 里面的 promise 對象失敗則立即觸發該 promise 對象的失敗。這個新的 promise 對象在觸發成功狀態以后,

    會把一個包含 iterable 里所有 promise 返回值的數組作為成功回調的返回值,順序跟 iterable 的順序保持一致;

    如果這個新的 promise 對象觸發了失敗狀態,它會把 iterable 里第一個觸發失敗的 promise 對象的錯誤信息作為它的失敗錯誤信息。

    Promise.all 方法常被用于處理多個 promise 對象的狀態集合。

  • Promise.race(iterable)

    當 iterable 參數里的任意一個子 promise 成功或失敗后,父 promise 馬上也會用子 promise 的成功返回值或失敗詳情作為參數調用

    父 promise 綁定的相應方法,并返回該 promise 對象。

  • Promise.reject(reason)

    調用 Promise 的 reject 方法,并返回這個 Promise 對象。

  • Promise.resolve(value)

    用成功值 value 完成一個 Promise 對象。如果該 value 帶有 then 方法,返回的 Promise 對象會跟隨這個 value,采用這個 value 的最終狀態;

    否則的話返回值會用這個 value 滿足(fulfilled)返回的 Promise 對象。

Promise 原型

屬性

  • Promise.prototype.constructor

    返回創建了實例原型的函數,默認為 Promise 函數。

方法

  • Promise.prototype.catch(onRejected)

    添加一個 rejection 回調到當前 promise ,返回一個新的 promise。如果這個回調被調用,新 promise 將以它的返回值來 resolve,否則如果當前

    promise 進入 fulfilled 狀態,則以當前 promise 的成功結果作為新 promise 的成功結果。

  • Promise.prototype.then(onFulfilled, onRejected)

    添加一個成功和失敗回調到當前 promise,返回一個新的 promise,將以回調的返回值來 resolve。

示例

下面例子展示了 Promise 的機制。每當按鈕被點擊時,testPromise() 方法就會被執行。該方法會創建一個用 window.setTimeout 1 到 3 秒后完成的 promise。

這里通過了 p1.then 方法的滿足回調,簡單的輸出了 promise 的滿足過程,這些輸出顯示了該方法的同步部分是如何和 promise 的異步完成解耦的。

<button onclick="testPromise();">點我</button>
<div id="log"></div>
<script>
    'use strict';
    var promiseCount = 0;
    function testPromise() {
        var thisPromiseCount = ++promiseCount;

        var log = document.getElementById('log');
        log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 開始(同步代碼開始)<br/>');

        // 創建一個新的promise: 然后用完成這個promise
        var p1 = new Promise(function (resolve, reject) {
            // 完成函數帶著完成(resolve)或拒絕(reject)promise 的能力被執行
            log.insertAdjacentHTML('beforeend', thisPromiseCount + ') Promise開始(異步代碼開始)<br/>');

            // 這只是個創建異步完成的示例
            window.setTimeout(function () {
                // 我們滿足(fullfil)了這個promise!
                resolve(thisPromiseCount)
            }, Math.random() * 2000 + 1000);
        });

        // 定義當promise被滿足時應做什么
        p1.then(function (val) {
            // 輸出一段信息和一個值
            log.insertAdjacentHTML('beforeend', val + ') Promise被滿足了(異步代碼結束)<br/>');
        });

        log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 建立了Promise(同步代碼結束)<br/><br/>');
    }
</script>

 

來自:http://svend.cc/posts/36621/

 

 本文由用戶 zluotan 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!