1. 程式人生 > 實用技巧 >理解JS中的Promise物件

理解JS中的Promise物件

  1. promise是非同步程式設計的一種解決方法

promise物件代表一個非同步操作,有三種狀態,pending(進行中)、fulfilled(已成功)、rejected(已失敗)
Promise物件是一個很神奇的東西, 究竟有哪些神奇呢?

  1. 怎麼用

基本用法

instance = new Promise(function(resolve, reject){
           ...
           //when things goes right:
           resolve(value);
           ...
           //when things goes wrong:
           reject(error);
})

說明:

  • promise表示的是一個非同步操作,每當我們new一個promise例項,就表示一個具體的非同步操作
  • 這個非同步操作的結果就只能有兩種狀態:成功/失敗,兩者都需要回調函式resolve/reject返回。所以內部拿到操作的結果後,無法使用return把操作結果返回給呼叫者

promise例項生成以後,可以用一個叫做then()方法來分別指定resolved狀態和rejected狀態的回撥函式

instance.then( //注意, instance這個Promise物件預設向then中傳入兩個引數(分別是promise中的value&error), 在這裡我們使用兩個函式來進行處理

    function(value){
        process(value);
    }
    function(error){ // 可選
        process(error);
    }
)

說明:

  • then方法可以鏈式回傳, 每個.then()中可以處理一個非同步物件(如Promise), 僅當非同步物件處理完畢之後, 才會向下一個then進行
  • 需要注意的一點就是,then方法返回的是一個新的Promise例項(注意,不是之前的Promise例項),因此可以採用鏈式寫法,即then方法之後再呼叫另一個then方法

promise例項生成以後,還有一個叫做catch()的方法來丟擲錯誤異常.catch
其實是 .then(undefined, () => {}) 的語法糖

Promise 物件的錯誤具有"冒泡"性質,會一直向後傳遞,直到被捕獲為止。也就是說,錯誤總是會被下一個 catch 語句捕獲。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 處理前兩個回撥函式的錯誤
});