概念
我理解的Promise就是一套為處理異步情況的方法。先創(chuàng)建一個(gè)promise對(duì)象來(lái)注冊(cè)一個(gè)委托,其中包括委托成功及失敗后的處理函數(shù)。然后基于這種表述方式,來(lái)將promise應(yīng)用到各種異步處理的情況中。
Promise的一個(gè)寫法案例
var promise = getAsyncPromise('fileA.txt');
promise.then( function(result){
// 成功時(shí)的處理辦法
}).catch( function(error){
// 失敗時(shí)的處理辦法
})
// 返回一個(gè)promise對(duì)象
基于這種統(tǒng)一的書寫方式,就可以簡(jiǎn)便的實(shí)現(xiàn)回調(diào),不需要去設(shè)計(jì)函數(shù)的名字,同時(shí)因?yàn)榉祷氐氖莗romise對(duì)象,可是實(shí)現(xiàn)連續(xù)的then調(diào)用。
使用Promise
一般情況下,我們會(huì)使用new Promise()來(lái)創(chuàng)建promise對(duì)象。
比如在一個(gè)AJAX請(qǐng)求中,使用promise來(lái)寫:
function ajax(options){
return new Promise(resolve, reject){
let {method, url} = options;
let xhr = new XMLHttpRequest();
xhr.open(method,url);
xhr.readystatechange = function(){
if(xhr.readystate >=200 && xhr.readystate<400){
resolve.call(null,xhr.responseText)
}else if(xhr.readystate >= 400){
reject.call(null,xhr.status)
}
}
}
xhr.send();
}
調(diào)用如下:
ajax({method:'GET',url:'www.baidu.com' })
.then(function(responseText){
console.log('我成功了')
console.log(responseText)
},function(status){
console.log('我失敗了')
console.log(status)
}
)
使用promise,對(duì)于異步的處理更加清晰簡(jiǎn)潔,一目了然,且promise支持鏈?zhǔn)秸{(diào)用,所以甚至可以這么用
promise.then(resolve,reject).then(resolve,reject)
其中的resolve和reject分別代表成功和失敗的函數(shù)。
兩個(gè)常用的Promise API
Promise.all ([promise1,promise2..])
返回一個(gè)新的Promise對(duì)象,當(dāng)該promise對(duì)象內(nèi)的參數(shù)對(duì)象都成功的狀態(tài)下才會(huì)觸發(fā)成功,有一個(gè)失敗則立即觸發(fā)失敗。
Promise.race ([promise1,promise2..])
當(dāng)參數(shù)里的任意一個(gè)promise成功或失敗后,該函數(shù)就會(huì)返回,并使用這個(gè)promise對(duì)象的值進(jìn)行resolve或reject
基本用法如下:
let promise1 = ajax({method:'GET',url:'/x.json'});
let promise2 = ajax({method:'GET',url:'/y.json'});
Promise.all([promise1,promise2]).then(function(){
console.log('兩個(gè)promise都執(zhí)行完成了')
});
Promise.race([promise1,promise2]).then(function(){
console.log('有一個(gè)promise先執(zhí)行完成了')
})