function onFulfilled(res){
console.log("(Fulfilled)第一層.then:", res);
return res
};
function onRejected(res){
console.log("(Rejected)第一層.then:", res);
throw res;
};
// resolve,reject 參數名可自定義,但為了好區分通常不會亂取
let p = new Promise(function(resolve, reject){
const judge = Math.random() > 0.5 ? true : false;
if(judge){
// 正確完成的回傳方法
resolve('Promise成功');
} else {
// 失敗的回傳方法
reject('Promise失敗');
};
})
/*
.then:
- .then會在上一層的Promise事件結束後被呼叫
- .then可帶入兩個回調函式(函式名可自取),兩者分別又可以帶入各自的參數
- onFulfilled(必選): 在成功(Fulfilled)時執行的函式,此函式帶入的參數為 Promise 函式中 resolve 所帶入的值
- onRejected(可選): 在失敗(Rejected)時執行的函式,此函式帶入的參數為 Promise 函式中 reject 所帶入的值
- 結束此次Promise事件:
- 回傳(return)一個值,代表此Promise事件結束,並進入「已實現」狀態(resolved)
- 拋出(throw)一個例外,代表此Promise事件結束,並進入「被拒絕」狀態(rejected)
*/
.then(onFulfilled, onRejected)
/*
可以一直.then下去,
- 當上層進入resolved時,也就是使用了return,表示上層Promise事件結束,且會進入到下層Promise事件,並被onFulfilled函式接收到
- return的回傳值會變成下層onFulfilled函式的參數值
- 當上層進入rejected時,也就是使用了throw,表示上層Promise事件結束,且會進入到下層Promise事件,並被onRejected函式接收到
- throw的錯誤值會變成下層onRejected函式的參數值
*/
.then(function(res){
// 只有onFulfilled函式,所以當上層Rejected時,會被後面.then中的onRejected函式接收到或是直接進入到.catch
console.log("(Fulfilled)第二層.then:", res);
return res;
})
.then((res) => {
console.log("(Fulfilled)第三層.then:", res);
return res;
}, (error) => {
console.log("(Rejected)第三層.then:", error);
throw error;
})
/*
.catch:
- 參數為一個回調函式,
- 當前面的.then有寫onRejected函式時,發生rejected會先進到.then,而不是.catch
- 當前面的.then都沒有寫onRejected函式時,發生rejected則會跳到.catch,此回調函式帶入的參數值同樣為 Promise 函式中rejected狀態所返回的值
*/
.catch(function(error){
console.log(".catch:", error);
})
/*
.finally中的回調函式不帶參數
- 通常用來關閉讀取等操作
*/
.finally(function(){
console.log("finally");
});
function promise(num, time = 500) {
let p = new Promise((resolve, reject) => {
// setTimeout()的作用是在延遲了某段時間(單位為毫秒)之後,才去執行「一次」指定的程式碼
setTimeout(() => {
if(num >= 1){
resolve(`${num}, 成功`)
}else{
reject('失敗');
};
}, time);
});
return p;
};
Promise.all([promise(1, 3000), promise(2), promise(3)])
.then(onFulfilled, onRejected)
.catch((error) => {
console.log(error);
});
function promise(num, time = 500) {
let p = new Promise((resolve, reject) => {
// setTimeout()的作用是在延遲了某段時間(單位為毫秒)之後,才去執行「一次」指定的程式碼
setTimeout(() => {
if(num >= 1){
resolve(`${num}, 成功`)
}else{
reject('失敗');
};
}, time);
});
return p;
};
Promise.race([promise(0), promise(2), promise(3, 3000)])
.then(onFulfilled, onRejected)
.catch((error) => {
console.log(error);
});
function onFulfilled(res){
console.log('In onFulfilled:', res);
return res
};
function onRejected(res){
console.log('In onRejected:', res);
return res
};
Promise.resolve('result')
.then(onFulfilled, onRejected);
function onFulfilled(res){
console.log('In onFulfilled:', res);
return res
};
function onRejected(res){
console.log('In onRejected:', res);
return res
};
Promise.reject('result')
.then(onFulfilled, onRejected);
function promise(num, timeout=500) {
let p = new Promise((resolve, reject) => {
// setTimeout()的作用是在延遲了某段時間(單位為毫秒)之後,才去執行「一次」指定的程式碼
setTimeout(() => {
resolve(`${num}成功`)
}, timeout);
});
return p;
};
async function run(){
try {
const result_with_no_await = Promise.all([promise(1, 3000), promise(2), promise(3)])
.then(([res1, res2, res3]) => {
return [res1, res2, res3];
});
// 因為沒有使用await關鍵字去等待,result_with_no_await的結果還沒出來,所以會返回 Promise { <pending> }
console.log(result_with_no_await);
const result_with_await = await Promise.all([promise(1, 3000), promise(2), promise(3)])
.then(([res1, res2, res3]) => {
return [res1, res2, res3];
});
// 因為有使用await關鍵字,所以程序會等result_with_await回傳後再繼續進行,有接收到值[ '1成功', '2成功', '3成功' ]
console.log(result_with_await);
} catch (error) {
console.log(error);
}
};
run();
JavaScript