ES6—Promise对象

一、含义

Promise是个对象,用于传递异步操作消息。使用Promise可以将异步操作以同步的流程表达出来,避免了层层嵌套的回调函数。
具有以下特征:

  • 对象的状态有三种:pending(进行中) resolved(已完成,又称Fullfilled)和rejected(已失败)。
  • 一旦状态改变之后,任何时候获取的结果都相同

二、基本用法

var promise = new Promise(function (resolve,  reject) {
    if (/* 异步操作成功 */) {
        resolve(value);
    } else {
       reject(error)
   }
})

其中,resolve和reject由Javascript引擎提供,不用自己部署,用于改变Promise对象的状态。
定义好对象之后可以设置该对象状态为成功和失败时执行的方法。

promise.then(function (value) {
    // success
}, function (value) {
    // fail
})

但是通常失败的方法不在第二个函数里写,而是通过catch语句中完成。catch方法是.then(null, rejection)

promise.then(function (value) {
    // success
}).catch(function (value) {
    // fail
})

(因为then返回的是promise对象,promise对象多次调用状态仍相同)

  • then里面的函数也即回调函数,如果resolve和reject函数带有参数,则会将该参数传递给回调函数。
  • resolve中参数除了正常的值外,还有可能是Promise实例(如B),表示该异步操作的结果依赖B的结果。
  • then方法返回的是一个新的Promise实例,可以使用链式写法,在then之后再调用另外一个then方法。链式的then中上一个then,可以返回一个Promise对象,下一个等待该对象状态发生变化时再调用。(注意:then返回的是一个新的Promise对象,并不是上一个Promise对象,下一个then获取的参数也是上一个then返回的参数)

    getJSON("/post/1.json").then(function(post) {
    return getJSON(post.commentURL);
    }).then(function funcA(comments) { // comments为getJSON(post.commentURL)的返回值
    console.log("resolved", comments);
    })
  • 跟传统的try/catch语句不同,如果没有指定catch方法对错误进行处理,该错误不会传递到外层代码,而是会被忽略。

三、Promise.all()

Promise.all()用于将多个Promise实例包装成一个新的Promise实例。
var p = Promise.all([p1, p2, p3]);

只有p1, p2, p3的状态同时变成resolved(Fullfilled),p的状态才会变成resolved,此时p1, p2, p3的返回值组成一个数组,传递给p的回调函数。
只要p1, p2, p3中有一个的状态为rejected,p的状态就为rejected,此时第一个状态变成rejected的实例的返回值会传递给p的回调函数。

四、Promise.race()

var p = Promise.race([p1, p2, p3]);
只要p1, p2, p3中有一个实例率先改变状态,p的状态就跟着改变,率先改变状态实例的返回值,会传递给p的回调函数。

五、Promise.resolve()(Promise.reject())

可以使用Promise.resolve()(Promise.reject())将现有对象转化成Promise对象,如果现有对象不具有then方法,则返回一个新的Promise对象,其状态为resolved(reject)

六、.done() .finally

.done 在Promise的回调链的最后添加,保证捕捉任何可能出现的错误,在发生错误的时候执行
.finally() 在Promise尾部,无论Promise的状态如何都会执行。

七、应用

1、加载图片
2、和Genterator函数结合
上一节提到的yield语句中为异步操作的请求,同样可以是Promise对象生成语句,通过Promise对象resolved状态回调执行Genterator的next方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值