ECMAscript 6 原生提供了 Promise 对象。

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。

. 首先介绍promise的两个特点:

1.promise的状态不受外界影响。Promise对象代表一个异步操作,它的三种状态也是非常重要的:

① pending: 初始状态,不是成功或失败状态。

② fulfilled: 意味着操作成功完成。

③ rejected: 意味着操作失败。

2.且只有异步操作的结果,可以决定当前是哪一种状态,任何其他的操作都无法改变这个状态。一旦状态改变,就不会在变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:

①  Pending 变为 Resolved

②  Pending 变为 Rejected。

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

二. Promise 优缺点

优点:有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。

缺点:Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

三. Promise 创建

要想创建一个promise对象,可以使用new来调用promise的构造器来进行实例化。

var promise = new Promise(function(resolve,reject){

        // 异步处理

        // 处理结束后,调用resolve或者reject

    })

Promise构造函数包含一个参数和一个带有resolve(解析)和reject(拒绝)两个参数的回调。再回调中执行一些操作(例如异步),如果一切正常,则调用resolve(解析),否则调用reject(拒绝)。

  var myFirstPsomise = new Promise(function(resolve,reject){

    // 当异步代码执行成功时,我们才会调用resolve(...),当异步代码失败时就会调用reject(...)

    // 在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法

        setTimeout(function(){

            resolve('成功') // 代码正常执行

        },500)

    })

    myFirstPsomise.then(function(successMessage){

    // successMessage的值是上面调用resolve(...)方法传入的值

    // successMessage参数不一定非要是字符串类型。

        document.write("打印到界面上的" + successMessage)

    })

对于已经实例化过得promise对象可以调用promise.then方法,传递resolvereject方法作为回调。

promise.then() promise 最为常用的方法。

promise.then(onFulfilled, onRejected)

promise简化了对error的处理,上面的代码我们也可以这样写:

promise.then(onFulfilled).catch(onRejected)

 

posted on 2020-12-01 16:37  小名香菜~  阅读(77)  评论(0编辑  收藏  举报