1. 程式人生 > 其它 >ES6-promise

ES6-promise

技術標籤:ES6es6javascriptjs

在這裡插入圖片描述

1 基本概念

  • 名稱:

譯為“承諾”,這也就表達了將來會執行的操作,代表非同步操作;

  • 狀態:

一共有三種狀態,分別為pending(進行中)、fulfilled(已成功)和rejected(已失敗)。

  • 特點:

(1)只有非同步操作可以決定當前處於的狀態,並且任何其他操作無法改變這個狀態;
(2)一旦狀態改變,就不會在變。狀態改變的過程只可能是:從pending變為fulfilled和從pending變為rejected。如果狀態發生上述變化後,此時狀態就不會在改變了,這時就稱為resolved(已定型)

2 基本用法

Promise 物件是由關鍵字 new 及其建構函式來建立的。


首先,
介紹一下如何建立一個 Promise;

const promise = new Promise((resolve, reject) => {
    // do something here ...
    if (success) {
        resolve(value); // fulfilled
    } else {
        reject(error); // rejected
    }
});

由上述程式碼我們可知: 該建構函式接收兩個函式作為引數,分別是resolve和reject。
當非同步操作執行成功後,會將非同步操作結果作為引數傳入resolve函式並執行,此時

Promise物件狀態從pending變為fulfilled; 失敗則會將非同步操作的錯誤作為引數傳入reject函式並執行,此時
Promise物件狀態從pending變為rejected;

接下來,
我們通過then方法,分別指定resolved狀態和rejected狀態的回撥函式。

  promise.then(function(value) {
      // success
  }, function(error) {
      // failure
  });

then方法可以接收兩個回撥函式作為引數,第一個回撥函式就是fulfilled狀態時呼叫;第二個回撥函式就是rejected時呼叫。這邊的第二個引數是可選的,不一定要提供。

all()方法:

Promise 的 all 方法提供了並行執行非同步操作的能力,並且在所有非同步操作執行完後才執行回撥。

race()方法:

race 按字面解釋,就是賽跑的意思。race 的用法與 all 一樣,只不過 all 是等所有非同步操作都執行完畢後才執行 then
回撥。而 race 的話只要有一個非同步操作執行完畢,就立刻執行 then 回撥。

注意:其它沒有執行完畢的非同步操作仍然會繼續執行,而不是停止。

then()方法

then 方法就是把原來的回撥寫法分離出來,在非同步操作執行完後,用鏈式呼叫的方式執行回撥函式。

而 Promise 的優勢就在於這個鏈式呼叫。我們可以在 then 方法中繼續寫 Promise 物件並返回,然後繼續呼叫 then
來進行回撥操作。

reject()方法:

上面樣例我們通過 resolve 方法把 Promise 的狀態置為完成態(Resolved),這時 then
方法就能捕捉到變化,並執行“成功”情況的回撥。 而 reject 方法就是把 Promise 的狀態置為已失敗(Rejected),這時
then 方法執行“失敗”情況的回撥(then 方法的第二引數)

普通函式中的this指向函式被呼叫的物件,因此對於不同的呼叫者,this的值是不同的。而箭頭函式中並沒有自己的this(同時,箭頭函式中也沒有其他的區域性變數,如this,argument,super等),所以箭頭函式中的this是固定的,它指向定義該函式時所在的物件。