理解JS中的Promise物件
阿新 • • 發佈:2020-07-29
- promise是非同步程式設計的一種解決方法
promise物件代表一個非同步操作,有三種狀態,pending(進行中)、fulfilled(已成功)、rejected(已失敗)
Promise物件是一個很神奇的東西, 究竟有哪些神奇呢?
- 怎麼用
基本用法
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) {
// 處理前兩個回撥函式的錯誤
});