概念
我理解的Promise就是一套为处理异步情况的方法。先创建一个promise对象来注册一个委托,其中包括委托成功及失败后的处理函数。然后基于这种表述方式,来将promise应用到各种异步处理的情况中。
Promise的一个写法案例
var promise = getAsyncPromise('fileA.txt');
promise.then( function(result){
// 成功时的处理办法
}).catch( function(error){
// 失败时的处理办法
})
// 返回一个promise对象
基于这种统一的书写方式,就可以简便的实现回调,不需要去设计函数的名字,同时因为返回的是promise对象,可是实现连续的then调用。
使用Promise
一般情况下,我们会使用new Promise()来创建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();
}
调用如下:
ajax({method:'GET',url:'www.baidu.com' })
.then(function(responseText){
console.log('我成功了')
console.log(responseText)
},function(status){
console.log('我失败了')
console.log(status)
}
)
使用promise,对于异步的处理更加清晰简洁,一目了然,且promise支持链式调用,所以甚至可以这么用
promise.then(resolve,reject).then(resolve,reject)
其中的resolve和reject分别代表成功和失败的函数。
两个常用的Promise API
Promise.all ([promise1,promise2..])
返回一个新的Promise对象,当该promise对象内的参数对象都成功的状态下才会触发成功,有一个失败则立即触发失败。
Promise.race ([promise1,promise2..])
当参数里的任意一个promise成功或失败后,该函数就会返回,并使用这个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都执行完成了')
});
Promise.race([promise1,promise2]).then(function(){
console.log('有一个promise先执行完成了')
})