ES6 Promise

本文是在阅读了别人的博客后,加入自己的理解写下的,如有理解错误的地方还请告知,谅解~
这里写图片描述
1.定义:
Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,
原型上有then、catch等同样很眼熟的方法.
2.简单例子

import es6 from '../helper/es6-promise'
  var p = new es6.Promise(function (resolve, reject) {
      setTimeout(function () {
        console.log('执行成功')
        resolve('执行成功后的回调函数')
        reject('执行失败后的回调函数~~')
      }, 2000)
    })

在上面的代码中,我们执行了一个异步操作,也就是setTimeout,2秒后,输出“执行完成”,并且调用resolve方法。

Promise的构造函数接收一个函数,且函数需要两个参数,表示异步操作执行成功和失败之后的回调函数
resolve:是将Promise的状态设置为fullfiled
reject:是将Promise的状态设置为rejected。

3.方法提取
上面的代码中我们只是new了一个对象,并没有调用,但是已经执行了,所以我们在用Promise的时候一般是包裹在一个函数中,需要的时候在调用

  function runAsync  () {
    var p = new es6.Promise(function (resolve, reject) {

      setTimeout(function () {
        console.log('执行成功')
        resolve('执行成功后的回调函数')
        reject('执行失败后的回调函数~~')
      }, 2000)
    })
    return p
  }

ok,Promise是个什么鬼,简单的认识了一个下,但resolve,reject,then,怎么用???

——————————————————————————————————-
执行完runAsync()函数之后会返回一个Promise对象,还记得Promise对象有then,catch方法,这就是它的强大之处。

    runAsync().then(function (data) {
      console.log(data)
    })

then函数接受一个参数,是函数,会拿到在runAsync中调用resolve时传的参数。以上代码输出的结果是:
执行成功
执行成功后的回调函数

对于在runAsync这个异步任务执行完成之后被执行。这就是Promise的作用了,简单来讲,就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

4.提问:就是个回调返回,如果我把回调封装一下,给runAsync传进去不也一样吗?

 runAsync: function (callBack) {
    setTimeout(function () {
      console.log('执行成功')
      callBack("方法回调,返回数据")
    }, 2000)
  }

  runAsync(function (data) {
      console.log(runAsyncA)
  })

答案是:如果是多层回到怎么办,如果callBack也是一个异步操作且执行后也需要相应的回调函数怎么办,所以Promise的then优势就体现出来了,在then方法中返回的Promise对对象并返回

5.链式操作

6.reject的用法

 function runAsync() {
      var p = new es6.Promise(function (resolve, reject) {
        console.log('执行成功')
        if(true)
                resolve('执行成功后的回调函数')
    else
            reject('执行失败后的回调函数~~')
      })
      return p
}

runAsync().then(
      function (data) {
        console.log('resolve')
        console.log(data)
      },
      function (data) {
        console.log('reject');
        console.log(data);
      })

7.catch的用法
作用1:用来接收reject的回调
作用2:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。

  runAsync()
      .then(function (data) {
        console.log('resolved');
        console.log(data);
        console.log(somedata); //此处的somedata未定义
      })
      .catch(function (reason) {
        console.log('rejected');
        console.log(reason);
      })

在.then中我们并没有定义somedata,所以会报错,如果我们没有使用Promise,代码的错误回被输出到控制台中,不在往下运行,但是使用catch,会直接将错误在catch中输出,几遍有错误也不会报错,这与使用的try/catch类似

8.all的用法
Promise.all方法提供了并行执行异步操作的能力,并且在所有异步操作完成后才执行回调
「谁跑的慢,以谁为准执行回调」

Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});

1.用Promise.all来执行,all接收一个数组参数,里面的值最终都算返回Promise对象。
2.三个异步操作的并行执行的,等到它们都执行完后才会进到then里面
3.三个异步操作返回的结果都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results

9.race的用法
「谁跑的快,以谁为准执行回调」,在then里面的回调开始执行时,其他并行函数并没有停止,仍旧再执行。
给某个异步请求设置超时时间,并且在超时后执行相应的操作

es6.Promise.race([b.run(), b.timeOut()]).then(function (results) {
      console.log(results)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值