1. 程式人生 > 程式設計 >JavaScript中的Promise詳解

JavaScript中的Promise詳解

目錄
  • Promise的基本用法:
    • 1、建立Promise物件
    • 2、Promise 方法
  • 總結

    Promise是非同步的一種解決方案,是一個物件,可以獲取非同步操作的訊息,大大改善了非同步程式設計的困難,避免了回撥地獄,比傳統的解決方案回撥函式和事件更合理和更強大。

    從語法上講,Promise是一個物件,它可以獲取非同步操作的訊息。提供了一個統一的API,各種非同步操作都可以用同樣的方法進行處理

    1、Promise的例項有三個狀態:

    (1)Pending(進行中)

    (2)Resolved(已完成)

    (3)Rejected (已拒絕)

    2、Promise的例項有兩個過程

    (1)pending > fulfiled :Resolved

    (2)pending > rejected :Rejected

    注意:一旦從進銷項狀態變為其他狀態就永遠不能更改狀態了

    Promise的基本用法:

    1、建立Promise物件

    Promise 物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)、rejected(已失敗)

    Promise建構函式接收一個函式作為參www.cppcns.com數,該函式的兩個引數分別是 resolve 和 reject

    2、Promise 方法

    Promise有五個常用方法:

    (1)then()

    then 方法可以接收兩個回撥函式作為引數,第一個回撥函式是Promise物件的狀態改變為 resoved 是呼叫,第二個回撥函式是 Promise 物件的狀態變為 rejected 時呼叫。其中第二個引數可以省略。

    let promise = new Promise((resolve,reject)=>{
        ajax('first').success(function(res){
            resolve(res);
        })
    })
    promise.then(res=>{
        return new Promise((resovle,reject)=>{
            ajax('second').success(function(res){
                resolve(res)
            })
        })
    }).http://www.cppcns.com
    then(res=>{ return new Promise((resovle,reject)=>{ ajax('second').success(function(res){ resolve(res) }) }) }).then(res=>{ })

    (2)catch()

    該方法相當於 then 方法的第二個引數,指向 reject 的回撥函式。

    另一個作用是,在執行resolve回撥函式時,如果出錯,丟擲異常,不會停止隕星,而是進入catch 方法中。

    p.then((data) => {
         console.log('resolved',data);
    },(err) => {
         console.log('rejected',err);
         }
    ); 
    p.then((data) => {
        console.log('resolved',data);
    }).catch((err) => {
        console.log('rejected',err);
    });

    (3)all()

    all 方法可以完成並進行任務,它接收的是一個數組,陣列的每一項都是 Promise 物件。當陣列中所有的 Promise 狀態都達到 resolved 的時候,all 方法的狀態就會變成 resolved,如果有一個狀態變成了 rejected。那麼all 方法的狀態就會變成rejected。

    
    let promise1 = new Promise((resolve,reject)=>{
    	setTimeout(()=>{
           resolve(1);
    	},2000)
    });
    let promise2 = new Promise((resolve,reject)=>{
    	setTimeout(()=>{
           resolve(2);
    	},1000)
    });
    let promise3 = new Promise((resolve,reject)=>{
    	setTimeout(()=>{
           resolve(3);
    	},3000)
    });
    Promise.all([promise1,promise2,promise3]).then(res=>{
        console.log(res);
        //結果為:[1,2,3] 
    })

    (4)rece()

    rece 方法和 all 一樣,接收的引數是一個每項都是 Promise 的陣列,但是與 all 不同的是,當最先執行完的事件執行完之後,就直接返回該 promise 物件的值

    rece的實際作用:當要做一件事,超過長時間就不做了,可以用這個方法來解決。

    Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})

    (5)finally()

    finally 方法用於指定不管 Promise 物件最後狀態如何,都會執行的操作。(該方法是ES2018中引入標準的)

    promise
    .then(result => {})
    .catch(error => {})
    .finally(() => {});

    finally 方法的回撥函式不接受任何引數,這意味著沒有辦法知道前面的 Promise 狀態到底是 fulfilled 還是 rejected

    promise
    .finally(() => {
      // 語句
    });
    // 等同於
    promise
    .then(
      result => {
        // 語句
        return result;
      },error => {
        // 語句
        throw error;
      }
    );

    在上面程式碼中,如果不寫 finally 方法,同樣的語句需要為成功和失敗兩種情況各寫一次。有了 finally 方法只需寫一次即可

    總結

    本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!