今天要來介紹新名詞Promise,中文翻譯是承諾!那這個名詞在JS裡有甚麼用處呢? 讓我們來看看八。首先,前幾篇我們不停地在講述著非同步的問題,當我們必須等待重遠端回來的資料,或是前一個函數執行完的結果,才能繼續做動時,這些非同步問題,而Promise就是用來處理JS非同步的語法結構。
非同步問題
JS是同步的程式語言,這代表同一個時間只能做一件事情,而遇到非同步事件的情況下,我們時常把程式碼放到最後,等待所有程式碼跑完才執行非同步事件。
console.log('網頁加載');
setTimeout(() => {
console.log('非同步');
}, 0);
console.log('網頁結束');
在這種情況下,雖然非同步的事件在中間,且setTimeout為0,但由於是非同步的關西,會在最後才印出"非同步"。
結構
Promise是一個建構出的函式,也屬於物件的一種,將promise給console.log出來我們可以看到他能夠使用的方法,包括了all、race、resolve、reject,四種方法。
而透過Promise函式new可以創建物件,透過物件可以使用then、catch、finally這三種方法,條件是要在Promise建構函式底下所建立。
const x = new Promise();
x.then(); // Promise 回傳成功時
x.catch(); // Promise 回傳失敗時
x.finally(); // 非同步執行完成。
在Promise建構函式創建時,我們必須傳入一個function當作參數,裡面包含兩個參數分別代表成功時,及失敗時的回傳做動,回傳結果後代表Promise結束。
new Promise(function(resolve, reject) {
resolve(); // 正確完成的回傳方法
reject(); // 失敗的回傳方法
});
狀態
Promise介紹完了結構,我們要看到非同步處理的進度狀態,總共會有三種,讓我們來看看以下三種狀態。
而我們來看一個簡單的例子。
function promise() {
return new Promise((resolve, reject) => {
// 隨機取得 0 or 1
const num = Math.random() > 0.5 ? 1 : 0;
// 1 則執行 resolve,否則執行 reject
if (num) {
resolve('成功');
}
reject('失敗')
});
}
建立一個函式promise(),而裡面就是一個簡單的Promise結構,透過帶入成功(resolve)與失敗(rejected)的參數,分別執行如果成功了就執行resolve,失敗執行reject。這就是一個最簡單的Promise例子!
下一篇我們要繼續介紹Promise的延伸,.then、.catch的用法。我們一起繼續努力吧。
參考資料:https://www.casper.tw/development/2020/02/16/all-new-promise/