let rt = new Promise((resolve, reject) => {
console.log('start!');
resolve('成功!');
console.log('fine!')
reject('失敗!');
});
rt.then(v => {
console.log(v);
}) .catch(err => {
console.log(err)
});
console.log('Hi!');
// start!
// fine!
// Hi!
// 成功!
Promise 構(gòu)造函數(shù)
接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject叹侄,它們是兩個函數(shù)巩搏,由 JavaScript 引擎提供,不用自己部署趾代。Promise 構(gòu)造函數(shù)是同步執(zhí)行的贯底,promise.then 中的函數(shù)是異步執(zhí)行的。
Promise
一旦新建它就會立即執(zhí)行撒强,無法中途取消禽捆。一旦狀態(tài)改變,就不會再變飘哨,任何時候都可以得到這個結(jié)果胚想。
所以,上例中芽隆, rt
是一個 Promise
對象浊服,resolve
之后,再調(diào)用 reject
是無效的胚吁,所以 rt
的狀態(tài)是 resolved
牙躺。
調(diào)用resolve或reject并不會終結(jié) Promise 的參數(shù)函數(shù)的執(zhí)行(所以會打印
fine!
)。上面代碼中腕扶,Promise 新建后立即執(zhí)行孽拷,所以首先輸出的是
start!
。然后輸出fine!
半抱,然后輸出Hi!
乓搬。而then方法指定的回調(diào)函數(shù)思犁,將在當前腳本所有同步任務(wù)執(zhí)行完才會執(zhí)行,所以
成功!
最后輸出进肯。then \ catch 方法調(diào)用后激蹲,都返回了一個新的promise對象,所以可以鏈式調(diào)用很多個
then
函數(shù)江掩。resolve
時可以添加參數(shù)学辱,參數(shù)會被傳遞到then
函數(shù)作為參數(shù)reject
時可以添加參數(shù),參數(shù)會被傳遞到catch
函數(shù)作為參數(shù)
环形,
Promise 中需要 return 嗎策泣?
上例可以看出,盡管我們無法改變一個已經(jīng)改變過狀態(tài)的Promise
抬吟,但是reject和resolve都無法讓函數(shù)剩下的部分終止執(zhí)行萨咕,那函數(shù)中 resolve
或者 reject
之后的部分的代碼可能會對我們造成干擾。
所以我們最好在 resolve 或者 reject 之后立即停止執(zhí)行火本。
resolve('成功!');
return;
或者省一行代碼:
return resolve('成功');
那如果是這樣呢危队?
resolve('成功!');
return '失敗!';
這個Promise的then
函數(shù)的參數(shù)仍然是 成功!
,也就是說 return
的值沒有任何用钙畔。
// 1: 對同一個promise對象同時調(diào)用 `then` 方法
var aPromise = new Promise(function (resolve) {
resolve(100);
});
aPromise.then(function (value) {
return value * 2;
});
aPromise.then(function (value) {
return value * 2;
});
aPromise.then(function (value) {
console.log(value); // 100
})
// vs
// 2: 對 `then` 進行 promise chain 方式進行調(diào)用
var bPromise = new Promise(function (resolve) {
resolve(100);
});
bPromise.then(function (value) {
return value * 2;
}).then(function (value) {
return value * 2;
}).then(function (value) {
console.log( value); //400
});
第1種寫法中并沒有使用promise的方法鏈方式茫陆,這在Promise中是應(yīng)該極力避免的寫法。這種寫法中的 then 調(diào)用幾乎是在同時開始執(zhí)行的擎析,而且傳給每個 then 方法的 value 值都是 100 簿盅。
第2中寫法則采用了方法鏈的方式將多個 then 方法調(diào)用串連在了一起,各函數(shù)也會嚴格按照 resolve → then → then → then 的順序執(zhí)行揍魂,并且傳給每個 then 方法的 value 的值都是前一個promise對象通過 return 返回的值桨醋。
也就是說,第一個 then
函數(shù)的參數(shù)是resolve
傳過來的现斋,后面的 then
函數(shù)的參數(shù)讨盒,是前面的then
函數(shù) return
的值
new Promise(() => {console.log(1)}).then(() => {console.log(2)})
這里永遠不會打印 2 , promise 的狀態(tài)永遠是 pending 不會改變,所以不會執(zhí)行 then
里的回調(diào)函數(shù)