Promise

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的回调函数将立即执行。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值