Vue教程-6-Promise

目录

概念

Promise的3种状态

Promise链式调用

Promise.all


概念

ES6自带一个非常重要和好用的特性,即Promise;Promise是异步编程的一种解决方案,比较完美的解决回调地狱的问题,从之前的“嵌套-嵌套-嵌套”改成了“链式调用”,下面通过一段代码来解释下变迁过程:

call((){

  doProcess(){

    发出网络请求

  },

  doSuccess(){

    网络请求成功

    if(data.flag = true){

        if(data.url != ''){

          call((){

            doProcess(){},

            doSuccess(){},

            doFail(){}

          });

        }

    }else{

      后台查询异常,或者,后台无此数据

    }

  },

  doFail(){

    网络请求失败

  }

});

上面这块代码,一层call函数嵌套一层call函数,这种类似于if里面嵌套if,一层套一层,而链式调用呢,有点类似JDK8的流运算:obj.xxx.xxx.xxx.xxx.xxx,形成一条链,方便维护:

<script>

export default {

  name: 'App'

}

// resolve本身又是函数,成功的时候调用

// reject本身又是函数,失败的时候调用 rejec('adad')

new Promise((resolve, reject) => {

  setTimeout(() => {

    console.log('------------------------------');

    // 如果这里调用了resolve()函数,代表执行成功,然后Promise就会去执行then方法

    resolve();

    // 如果这里调用了reject()函数,代表执行成功,然后Promise就会去执行catch方法

    reject('失败信息');

  },5000);

}).then(()=>{

  console.log('------------------------------');

  return new Promise((resolve, reject) => {

    setTimeout(() => {

      console.log('------------------------------');

      resolve();

    },5000);

  });

}).catch((error)=>{console.log(error)}).then(()=>{}).catch((error)=>{});;

</script>

或者这样

<script>

export default {

  name: 'App'

}

// resolve本身又是函数,成功的时候调用

// reject本身又是函数,失败的时候调用 rejec('adad')

new Promise((resolve, reject) => {

  setTimeout(() => {

    // 如果这里调用了resolve()函数,代表执行成功,然后Promise就会去执行then方法

    // resolve('成功信息');

    // 如果这里调用了reject()函数,代表执行成功,然后Promise就会去执行catch方法

    reject('失败信息');

  },5000);

  // then有2个参数,第1个参数代表resolve的参数,第2个参数代表reject的参数,因此,一个then可以融合then与catch方法

}).then(data => {console.log(data)},err => {console.log(err)});

</script>

Promise的3种状态

Pending:等待状态,比如正在进行网络请求,或者定时器没有到时间;(网络请求中,尚未拿到返回结果)

Fulfill:满足状态,当我们主动回调resolve函数时,就会处于该状态,并且会回调then函数,结果在then中处理;(通俗来讲就是网络请求结束且正常返回结果)

Reject:拒绝状态,当我们主动回调了reject函数时,就会处于该状态,并且会回调catch函数;(网络请求失败)

Promise链式调用

<script>

export default {

  name: 'App'

}

// resolve本身又是函数,成功的时候调用

// reject本身又是函数,失败的时候调用 rejec('adad')

new Promise((resolve, reject) => {

  setTimeout(() => {

    // 如果这里调用了resolve()函数,代表执行成功,然后Promise就会去执行then方法

    // resolve('成功信息');

    // 如果这里调用了reject()函数,代表执行成功,然后Promise就会去执行catch方法

    reject('失败信息');

  },5000);

  // then有2个参数,第1个参数代表resolve的参数,第2个参数代表reject的参数,因此,一个then可以融合then与catch方法

}).then(data => {

  // return Promise.resolve(data);

  // 这里等效于 return Promise.resolve(data);

  return data;

},err => {

  console.log(err)

});

</script>

Promise.all

Promise.all([

  new Promise((resolve, reject)=>{resolve(data)}),

  new Promise((resolve, reject)=>{resolve(data)}),

  new Promise((resolve, reject)=>{resolve(data)})

]).then(results => {

  // 上面有3个网络请求,当这3个网络请求都结束之后,由于都是调用的resolve,当这3个网络请求都执行resolve后

  // 再调用all的then方法,该方法参数是一个数组,数组长度对应着网络请求的数据,数组里面的值就是resolve方法传过来的参数

  results[0]

  results[1]

  results[2]

});

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值