??Promise的產(chǎn)生源于JavaScript對(duì)異步編程的需求拣凹,以前的js,都是單線程的恨豁,但是嚣镜,ajax技術(shù)出來之后,異步就成了網(wǎng)絡(luò)請(qǐng)求中的主流橘蜜。
??當(dāng)我們需要確保某段代碼在誰誰之后執(zhí)行菊匿,我們就可以利用函數(shù)調(diào)用棧,將我們想要調(diào)用的代碼放入回掉函數(shù)之中。
function test() {
console.log('想要調(diào)用的代碼')
}
function callback(test) {
//.........之前調(diào)用的代碼
test();
}
??這樣的話跌捆,就造成了傳說中的回調(diào)地獄徽职。代碼可讀性及其差。
ar fn = function(num) {
return new Promise(function(resolve, reject) {
if(typeof num == 'number') {
resolve(num)
} else {
reject('TypeError')
}
})
}
fn(2).then(function(num) {
console.log('first:' + num)
return num + 1
}).then(function(num) {
console.log('second:' + num)
return num + 1
}).then(function(num) {
console.log('third:' + num)
return num + 1
})
??引入Promise之后的寫法就相對(duì)可讀性好一點(diǎn)佩厚。Promise對(duì)象有三個(gè)狀態(tài)姆钉,pending、resolved可款、rejected育韩。Promise對(duì)象的回調(diào)函數(shù)中reject()和resolve()是兩個(gè)狀態(tài)修改方法。pending只能修改為resolved或者rejected闺鲸。
reject() 表示收到了結(jié)果筋讨,但不是期望的,將狀態(tài)修改為拒絕(rejected)
resolve() 表示收到了結(jié)果摸恍,是預(yù)期的悉罕,將狀態(tài)改為完成(resolved)
.then(resolve, reject) then函數(shù)是對(duì)于promise狀態(tài)修改之后的操作函數(shù),它接受兩個(gè)回調(diào)函數(shù)立镶,第一個(gè)參數(shù)是表示狀態(tài)為resolved時(shí)執(zhí)行壁袄。第二個(gè)為狀態(tài)為rejected時(shí)執(zhí)行。所以第二個(gè)參數(shù)一般不寫媚媒,用.catch()捕獲異常嗜逻。即.then(null, function() {}) == .catch(){}
.all() 接受一個(gè)Promise隊(duì)列數(shù)組,當(dāng)數(shù)組中的Promise對(duì)象狀態(tài)全部改變時(shí)才執(zhí)行then方法缭召。
.race() 和all方法相反栈顷,只要有一個(gè)promise對(duì)象狀態(tài)改變,就執(zhí)行then方法嵌巷。
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});