1. Promise对象
Promise对象代表了未来将要发生的事件,用来传递异步操作的信息。
1.1 特点
(1)对象的状态不受外界影响,Promise对象代表一个异步操作,有三种状态:
* pending:待定,初始状态,不是成功也不是失败
* fulfilled: 操作完成成功
* rejected:操作失败
只有异步操作的结果,可以决定当前是哪一状态,任何其他操作都无法改变这个状态。这也是Promise名字的由来,意思是承诺 ,表示其他手段无法改变
(2)一旦状态改变,就不会再变,任何时候都可以得到这个状态。只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要两种情况发生,状态就不会再变化了。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。而事件(event)就不同,特点是,如果你错过了它,再去监听是得不到结果的,如dom监听元素的click事件
1.2 Promise优缺点
优点:
1)有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
2)Promse对象提供统一的接口,使得控制异步操作更加容易
缺点:
1) 无法取消 Promise,一旦新建它就会立即执行,无法中途取消
2)如果不是回调函数,Promise内部抛出的错误,不会反应到外部
3)当处于pending状态时,无法得知目前进展到哪一个阶段
2. Promise对象的创建
创建Promise对象,可以使用new来调用Promise的构造器来进行实例化
var promise = new Promise(function(resolve,reject)){
//异步处理
}
在回调中执行一些操作(例如异步),如果一切正常,则调用resolve,否则调用reject
对于已经实例化的promise对象可以调用promise.then()方法,传递resolve和reject方法作为回调
promise.then()是promise最为常用的方法
promise.then(onFulfilled,onRejected)
promise简化了对error的处理,上面的代码也可以这样写:
promise.then(onFulfilled).catch(onRejected)
3. Promise Ajax
以ajax为例,做一个promise实例
function ajax(url){
return new Promise(function(resolve,reject){
var req = new XMLHttpRequest();
req.open('GET',url,true);
req.onload=function(){
if(req.status === 200){
resolve(req.responseText)
}else{
reject(new Error(req.statusText))
}
}
req.onError = function(){
reject(new Error(req.statusText))
}
req.send();
})
}
var url = "/try/ajax/testpromise.php";
ajax(url).then(function onFulfilled(value){
//
}).catch(function onRejected(error){
//
})
上述代码中,resolve和reject方法调用时,都带参数。它们的参数会被传递给回调函数。reject方法的参数通常是Error对象实例,而resolve方法的参数除了正常的值以外,还可能是另一个Promise实例,比如下方:
var p1 = new Promise(function(resolve,reject){
//...
})
var p2 = new Promise(function(resolve,reject){
//...
resolve(p1)
})
上述代码中,p1和p2都是promise实例,但是p2的resolve方法将p1作为参数,这时p1的状态就传给p2。如果调用的时候,p1的状态是pending,那么p2的回调就会等待p1的状态改变;如果p1的状态已经是fulfilled或者rejected,那么p2的回调函数将立即执行。