Promise

前段時間公司小程序項目使用了Promise來解決異步調(diào)用的問題,今天簡單總結(jié)一下

1.Promise 的用法

Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。它由社區(qū)最早提出和實現(xiàn),ES6 將其寫進了語言標準,統(tǒng)一了用法,原生提供了Promise對象。

所謂Promise,簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果。從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息。Promise 提供統(tǒng)一的 API,各種異步操作都可以用同樣的方法進行處理。

Promise對象有以下兩個特點。

(1)對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結(jié)果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。

(2)一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)?code>fulfilled和從pending變?yōu)?code>rejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果,這時就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對Promise對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監(jiān)聽,是得不到結(jié)果的。

有了Promise對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise對象提供統(tǒng)一的接口,使得控制異步操作更加容易。

Promise也有一些缺點。首先,無法取消Promise,一旦新建它就會立即執(zhí)行,無法中途取消。其次,如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯誤,不會反應(yīng)到外部。第三,當處于pending狀態(tài)時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。

如果某些事件不斷地反復發(fā)生,一般來說,使用 Stream 模式是比部署Promise更好的選擇。

以上簡介為抄襲(概念這東西,別人已經(jīng)總結(jié)好了,沒必要在浪費時間,不贊同的可以抵制),歸納一下個人理解:

Promise對象,相當于將以前我們傳遞的function包裝起來,有個一個規(guī)范性的簡單易懂的寫法。更重要的事,將異步添加進去,使我們可以更簡潔的使用異步、異步的依賴、異步的并行等。用then關(guān)鍵字來調(diào)用func,并且在func完成提供了成功resolve和失敗reject數(shù)據(jù)的返回

1.最簡單的Promise的用法

- Promise 可以異步執(zhí)行代碼,讓異步代碼和邏輯代碼進行一個一個分離

- 簡單的用法如下,簡單愛介紹一下 `resolve` 表示講成功數(shù)據(jù)使用`resolve` 返回,失敗使用`reject`返回
    ```
      let p = new Promise(function(resolve, reject) => {
            var timeOut = Math.random() * 2;
            setTimeout(function () {
                if (timeOut < 1) {
                    log('call resolve()...');
                    resolve('200 OK');
                }
                else {
                    log('call reject()...');
                    reject('timeout in ' + timeOut + ' seconds.');
                }
            }, timeOut * 1000);
        })
        p.then(result=>{
            /// 成功回掉

        }).catch(err=>{
            /// 失敗回掉

        })
        
    ```

2.如果需要串行執(zhí)行異步任務(wù)的時候,我們也可以使用Promise執(zhí)行

- 簡單演示  概括未`p.then(objc1).then(objc2).then(res=>{}).catech(err=>{})`  注意:`p`和`objc1`和`objc2`和`objc2`等都是`Promise`對象
    ```
    function multiply(input) {
        return new Promise(function (resolve, reject) {
            log('calculating ' + input + ' x ' + input + '...');
            setTimeout(resolve, 500, input * input);
        });
    }

    // 0.5秒后返回input+input的計算結(jié)果:
    function add(input) {
        return new Promise(function (resolve, reject) {
            log('calculating ' + input + ' + ' + input + '...');
            setTimeout(resolve, 500, input + input);
        });
    }
    var p = new Promise(function (resolve, reject) {
        log('start new Promise...');
        resolve(123);
    });

    p.then(multiply)
     .then(add)
     .then(multiply)
     .then(add)
     .then(function (result) {
        log('Got value: ' + result);
    });

    ```

3.如果需要并行執(zhí)行異步任務(wù)的時候,我們可以使用Prosime.all()方法來實現(xiàn)

簡單演示一下:
    ```
        var p1 = new Promise(function (resolve,reject) {
            
            setTimeout(resolve,500,"我是p1");
        })

        var p2 = new Promise(function (resolve,reject){
            setTimeout(resolve,600,"我是P2");
        })

        Promise.all([p1,p2]).then(res=>{
            /// res 是Promise的集合
            conslog(res);
        }).catch(err=>{

        })
    ```

4.如果需要并行執(zhí)行異步任務(wù),如果其中一個返回,就不需要丟棄其他任務(wù)時候,我們可以使用Promise.race()

簡單演示一下
    ```
        var p1 = new Promise(function (resolve,reject) {
            
            setTimeout(resolve,500,"我是p1");
        })

        var p2 = new Promise(function (resolve,reject){
            setTimeout(resolve,600,"我是P2");
        })

        Promise.race([p1,p2]).then(res=>{
            conslog(res);
        }).catch(err=>{

        })

    ```
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容