概念
我理解的Promise就是一套為處理異步情況的方法。先創(chuàng)建一個promise對象來注冊一個委托,其中包括委托成功及失敗后的處理函數(shù)。然后基于這種表述方式,來將promise應用到各種異步處理的情況中。
Promise的一個寫法案例
var promise = getAsyncPromise('fileA.txt');
promise.then( function(result){
// 成功時的處理辦法
}).catch( function(error){
// 失敗時的處理辦法
})
// 返回一個promise對象
基于這種統(tǒng)一的書寫方式,就可以簡便的實現(xiàn)回調(diào),不需要去設(shè)計函數(shù)的名字,同時因為返回的是promise對象,可是實現(xiàn)連續(xù)的then調(diào)用。
使用Promise
一般情況下,我們會使用new Promise()來創(chuàng)建promise對象。
比如在一個AJAX請求中,使用promise來寫:
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,對于異步的處理更加清晰簡潔,一目了然,且promise支持鏈式調(diào)用,所以甚至可以這么用
promise.then(resolve,reject).then(resolve,reject)
其中的resolve和reject分別代表成功和失敗的函數(shù)。
兩個常用的Promise API
Promise.all ([promise1,promise2..])
返回一個新的Promise對象,當該promise對象內(nèi)的參數(shù)對象都成功的狀態(tài)下才會觸發(fā)成功,有一個失敗則立即觸發(fā)失敗。
Promise.race ([promise1,promise2..])
當參數(shù)里的任意一個promise成功或失敗后,該函數(shù)就會返回,并使用這個promise對象的值進行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('兩個promise都執(zhí)行完成了')
});
Promise.race([promise1,promise2]).then(function(){
console.log('有一個promise先執(zhí)行完成了')
})