一日客語:中文:鳳梨 客語:vong(三聲)李(黃梨)
簡化非同步程式設計的一項語言
mdn:new Promise ( /* executor */ function(resolve, reject) { ... } );
Promise 是建構子需要大寫,和new 創建出一個物件
callback function (第一個參數:resolve、第二個參數:reject )
resolve、reject 參數是各自的 function
新創建的物件會是非同步計算結果,裡面會有 [[PromiseState]] 表示目前狀態
const promise = new Promise((resolve, reject) => {});
//也可以自行定義
const promise = new Promise((sucessful, fail) => {});
此時PromiseState : ”pending"
物件剛建立會先處在 pending 狀態
promise 物件會有三種狀態:
pending:未取得結果
fulfilled:成功完成
rejected:失敗
他的 [[promiseState]] 會是 pending
const myPromise = new Promise((resolve, reject) => {
console.log('執行了喔');
// resolve('pmyPromise狀態改成rejected');
});
promise 被完成,會呼叫 resolve
當有執行 resolve function 他的狀態會變成"fulfilled"
const myPromise = new Promise((resolve, reject) => {
console.log('執行了喔');
resolve('pmyPromise狀態改成fulfilled');
});
看看瀏覽器顯示:
如下圖
當有執行 reject function 他的狀態會變成 "rejected"
const myPromise = new Promise((resolve, reject) => {
console.log('執行了喔');
reject('pmyPromise狀態改成rejected');
});
看看瀏覽器顯示:
如下圖
const promise = new Promise((resolve, reject) => {
throw '糟糕要失敗了';
console.log('開始');
});
promise.then(
//resolve
(resolve) => console.log(resolve + '耶成功'),
//reject
(reject) => console.log(reject + 'QQ被拒絕')
);//糟糕要失敗了QQ被拒絕
Promise具有then()方法,promise.then()
mdn:p.then(onFulfilled[, onRejected]);
then() 方法回傳一個 Promise 物件。
接收兩個引數: Promise 在成功及失敗情況時的回呼函式callback function。
第一個callback function,由resolve值傳入
第二個callback function,由reject值傳入
const promise = new Promise((resolve, reject) => {
resolve('我是resolve');
});
promise.then(
//resolve
(resolve) => console.log(resolve + '耶成功'),
//reject
(reject) => console.log(reject + 'QQ被拒絕')
);
//我是resolve耶成功
const promise = new Promise((resolve, reject) => {
reject('我是reject');
});
promise.then(
//resolve
(resolve) => console.log(resolve + '耶成功'),
//reject
(reject) => console.log(reject + 'QQ被拒絕')
);
//我是rejectQQ被拒絕
可以用另一種寫法:then()和catch()
const promise = new Promise((resolve, reject) => {
reject('我是reject');
});
promise
.then(
//resolve
(resolve) => console.log(resolve + '耶成功')
)
.catch(
//reject
(reject) => console.log(reject + 'QQ被拒絕')
);
let myPromise = new Promise((resolve, reject) => {
resolve('我是resolve');
});
myPromise.then((result) => console.log('你是誰', result));
//你是誰 我是resolve
執行順序:發現 then 是最後才被印出
function funcA() {
return new Promise(function (reslove, reject) {
console.log('nini:你在哪裡');
setTimeout(() => {
reslove('渣男:我在家裡啊');
}, 1000);
});
}
funcA().then(function (x) {
console.log(x);
});
console.log('這裡是外面');
console.log('這裡是外面');
console.log('這裡是外面');
console.log('這裡是外面');
//nini:你在哪裡
//這裡是外面
//這裡是外面
//這裡是外面
//這裡是外面
//渣男:我在家裡啊
因為funcA().then(function (x) { console.log(x); });
這個仍是非同步
男主角給女主角一個promise,表示要求婚了,會有兩種狀況
1.結婚,表示求婚成功
2.不結,表示求婚失敗
當隨機數字是1,女主答覆嫁,非1,女主角不嫁
利用then()來看女方答覆,加上吃瓜民眾結論
yes:女主角答覆+'女主角說願意,求婚成功'
no: 女主角答覆+'女主角說不願意,求婚失敗'
呈現結果會是
1.不嫁 女主角說不願意,求婚失敗
2.嫁 女主角說願意,求婚成功
function woman() {
let randomNumber = Math.random() * 3;
let random = Math.floor(randomNumber);
return new Promise(function (resolve, reject) {
if (random === 1) {
return resolve('嫁');
} else {
return reject('不嫁');
}
});
}
woman()
.then((yes) => console.log(yes, '女主角說願意,求婚成功'))
.catch((no) => console.log(no, '女主角說不願意,求婚失敗'));
可以利用 chaining Promises做出有順序的非同步執行
fetch(url).then(1).then(2).catch()
最後一個catch()處理發生任何錯誤
每一個then()方法都會回傳一個新物件
let person = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('要不要和我再一起');
}, 1000);
});
person.then((result) => {
//傳給then 一個promise且回傳一個新值
console.log(result);
return '願意';
});
//要不要和我再一起
當return '願意'
他的[[PromiseResult]]: "願意"
當沒有return
他的[[PromiseResult]]: "undefined"
let person = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('要不要跟我在一起啊nini');
}, 3 * 100);
});
person
.then((result) => {
console.log(result);
return 'niki';
})
.then((result) => {
console.log(`${result}要不要跟我在一起啊`);
return 'kiki';
})
.then((result) => {
console.log(`${result}要不要跟我在一起啊`);
return 'mimi';
});
//要不要跟我在一起啊nini
//niki要不要跟我在一起啊
//kiki要不要跟我在一起啊
不同人打給渣男例子
function funcA() {
return new Promise(function (reslove, reject) {
console.log('nini:你在哪裡');
setTimeout(() => {
reslove('渣男:我在家裡啊');
}, 1000);
});
}
function funcB() {
return new Promise(function (reslove, reject) {
console.log('niki:你在哪裡啊');
setTimeout(() => {
reslove('渣男:我在公司啊');
}, 1000);
});
}
function funcC() {
return new Promise(function (reslove, reject) {
console.log('kiki:你在哪裡啊');
setTimeout(() => {
reslove('渣男:我找朋友');
}, 1000);
return '沒有人發現我在外面';
});
}
funcA()
.then(function (x) {
console.log(x);
return funcB();
})
.then(function (y) {
console.log(y);
return funcC();
})
.then(function (z) {
console.log(z);
});
console.log('*********這裡是酒吧*************');
//nini:你在哪裡
//*********這裡是酒吧*************
//渣男:我在家裡啊
//niki:你在哪裡啊
//渣男:我在公司啊
//kiki:你在哪裡啊
//渣男:我找朋友
男主角有三位女朋友
理想結婚人選 1.nini 2.niki 3.kiki
nini 小姐求婚,
求婚成功:結婚
求婚失敗:和下一位niki小姐求婚
niki 小姐求婚
求婚成功:結婚
求婚失敗:和下一位kiki小姐求婚
kiki 小姐求婚
求婚成功:結婚
求婚失敗:沒人願意和他結婚。 幫他QQ
套路是同招數一直使用
function marry(name) {
let randomNumber = Math.random() * 3;
let random = Math.floor(randomNumber);
return new Promise(function (resolve, reject) {
if (random === 1) {
reject(` ${name} :說願意`);
} else {
resolve(` ${name} :說不願意`);
}
});
}
marry('nini')
.then((fail) => {
console.log(`求婚結果1${fail}`);
return marry('niki');
})
.then((fail) => {
console.log(`求婚結果2${fail}`);
return marry('kiki');
})
.then((fail) => {
console.log(`求婚結果3${fail}`);
return '沒人要跟我結婚';
})
.catch((success) => {
console.log(`求婚成功` + success);
return '終於有對象';
});
大概會是這樣的結果
害怕遇到渣男嗎?快來搞懂promiseXD
JavaScript Promise 全介紹
Introduction to the JavaScript promise chaining
[JS] Promise 的使用
JavaScript大全第七版