我們前面介紹了Promise的簡單建構函式用法,以及Promise函式可以使用的方法Promise.all、race、resolve、reject,以及Promise在處理非同步事件時的狀態,包含處理中pending、執行處理成功resolved、執行處理失敗rejected,而今天要介紹在Promise中使用resolve 或 reject 回傳結果後,用then、catch取得值。
Promise三種狀態
不管是哪一種狀態,一定會有Pending的過程,而接下來就是兩種結果Fulfilled(成功)、Rejected(失敗)。並用then()及catch()取得成功或失敗的結果。
我們在.then中可以帶入兩個參數,分別式onFulfilled及onRejected兩個函式,兩者函式都可以帶入自己的參數。
.then(onFulfilled, onRejected)。
範例:帶入.then(onFulfilled, onRejected)兩者參數,分別為成功及失敗。
promise()
.then((success) => {
console.log('成功');
}, (fail) => {
console.log('失敗');
})
但習慣上我們使用.then()抓取成功的結果,失敗的部分由catch()抓取,這兩種寫法都可以。
promise()
.then(success => {
console.log('成功');
})
.catch(fail => {
console.log('失敗');
});
而.then及.catch不是只能有一個,可以有多個.then及.catch不斷執行接下來的任務,在這個範例中我們傳入數值0 會進入reject,其他都是成功resolve。
function promise(num) {
return new Promise((resolve, reject) => {
num ? resolve(`${num}, 成功`) : reject('失敗');
});
}
我們可以透過return進入下一個.then裡面,執行接下來的任務,retrun方法不局限於promise函式,所有表達式都可以進行回傳,promise的話會依造then及catch的運作,如果不是promise的話,在下一個then可以取得結果。
promise(1)
.then(success => {
console.log(success);
return promise(2);
})
.then(success => {
console.log(success);
return promise(0); // 帶入數值0,所以進入了catch
})
.then(success => { // 上一個執行時進入了catch,所以這段不執行
console.log(success);
return promise(3);
})
.catch(fail => {
console.log(fail);
})
除了.then()、.cathch()以外,最後還要介紹finally,finally不用帶入參數,可以運用在ajax取得遠端資料後,使用finally來關閉讀取效果。
promise(1)
.then(success => {
console.log(success);
}).finally(() => {
console.log('完成');
})
那我們今天的介紹就到這邊了!明天再讓我們一起努力吧。