1. 程式人生 > 實用技巧 >ES6----Promise(部分)

ES6----Promise(部分)

Promise

  Promise是非同步程式設計的一種解決方案,比傳統的解決方案--回撥函式和事件--更合理和更強大。

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

  Promise物件有以下兩個特點:

  1.物件的狀態不受外界影響。promise物件代表一個非同步操作,有三種狀態:pending(進行中),fulfilled(已成功)和rejected(已失敗)。

  2,一旦狀態改變,就不會再變,任何時候都可以得到這個結果。

  好處:有了promise物件,就可以將非同步操作以同步操作的流程表達出來,避免了層層巢狀的回撥函式。此外,promise物件提供統一的介面,使得控制非同步操作更加容易。

  缺點:無法取消promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設定回撥函式,promise內部丟擲的錯誤,不會反應到外部。第三,當處於pending狀態時,無法得知目前進展到哪個階段。

  

  Promise.prototype.then()

  then方法返回的是一個新的Promise例項,因此可以採用鏈式寫法,即then方法後面再呼叫另一個then方法。  

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

  採用鏈式的then

,可以指定一組按照次序呼叫的回撥函式。這時,前一個回撥函式,有可能返回的還是一個Promise物件(即有非同步操作),這時後一個回撥函式,就會等待該Promise物件的狀態發生變化,才會被呼叫。

  Promise.prototype.catch

  promise丟擲一個錯誤,就被catch()方法指定的回撥函式捕獲。

const promise = new Promise(function(resolve, reject) {
  throw new Error('test');
});
promise.catch(function(error) {
  console.log(error);
});

  

  Promise.prototype.finally()

  finally()方法用於指定不管promise物件最後狀態如何,都會執行的操作。

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

  上面程式碼中,不管promise最後的狀態,在執行完thencatch指定的回撥函式以後,都會執行finally方法指定的回撥函式。

  

  Promise.all()

  Promise.all()方法用於將多個 Promise 例項,包裝成一個新的 Promise 例項。