普歌-Promise用法

Promise概述

Promise是异步编程的一种解决方案,从语法上来讲,Promise是一个对象,从而它可以获取异步操作的消息

使用Promise主要有以下好处:

可以避免多层异步调用嵌套问题(回调地狱)
Promise对象提供了简洁的API,使得控制异步操作更加容易

Promise基本用法

实例化Promise对象,构造函数中传递函数,该函数中用于处理异步任务
resolvereject两个参数用于处理成功和失败两种情况,并通过Promise.then获取处理结果

var p = new Promise(function(resolve,reject){
   // 成功时调用 resolve()
   // 失败时调用 reject()
});
p.then(function(res){
   // 从resolve得到正常结果
},function(ret){
   // 从reject得到错误信息
})

基于Promise处理Ajax请求

1.处理原生Ajax

function queryData(){
  return new Promise(function(resolve,reject){
     var xhr = new XMLHttpRequest();
     xhr.onreadystatechange = function(){
       if(xhr.readyState != 4) return;
       if(xhr.status == 200) {
          resolve(xhr.responseText)
       }else{
          reject('出错了')
       }   
     }
     xhr.open('get','/data');
     xhr.send(null)
  })
}

2.发送多次Ajax请求

queryData()
   .then(function(data){
      return queryData()
   })
   .then(function(data){
      return queryData()
   })
   .then(function(data){
      return queryData()
   })

3.then参数中的函数返回值

  • 返回Promise实例对象

返回的该实例对象会调用下一个then

  • 返回普通值

返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收该值

4.Promise常用的API

  • 实例方法

p.then() 得到异步任务的正确结果
p.catch() 获取异常信息
p.finally() 成功与否都会执行(尚且不是正式标准)

queryData()
   .then(function(data){
      console.log(data)
   })
   .catch(function(data){
      console.log(data)
   })
   .finally(function(data){
      console.log('finished')
   })
  • 对象方法

Promise.all() 并发处理多个异步任务,所有任务都执行完成才能得到结果
Promise.race()并发处理多个异步任务,只要有一个任务完成就能得到结果

Promise.all([p1,p2,p3]).then((res)=>{
   console.log(res)
})

Promise.race([p1,p2,p3]).then(res)=>{
   console.log(res)
}

Promise的三种状态

  • pending resolved rejected
  • pending ==> resolvedpending ==>rejected (变化不可逆)

pending状态,不会触发 then 和 catch
resolved状态,会触发后续的 then 回调函数
rejected状态,会触发后续的 catch 回调函数

then 和 catch 改变状态

then 正常返回 resolved,里面有报错则返回 rejected
catch 正常返回 resolved,里面有报错则返回 rejected

还有一点注意!!
resolved 触发后续的 then 回调
rejected 触发后续 catch 回调

const p3 = Promise.reject('error').catch(err => {
   console.log(err)
})
console.log('p3',p3) // resolved 注意!!

老样子,看题 ==> ⭕️

1.第一题

Promise.resolve().then(() => {
   console.log(1) // 1 resolved 注意!触发 catch 回调
}).catch(() => {
   console.log(2) // 不走这儿
}).then(() => {
   console.log(3) // 3 resolved
})

2.第二题 这儿会有一个坑

Promise.resolve().then(() => {
   console.log(1) // 1 
   throw new Error('error') // rejected 注意!触发 catch 回调
}).catch(() => {
   console.log(2) // 2 resolved 注意!触发 then 回调
}).then(() => {
   console.log(3) // 3
})

3第三题

Promise.resolve().then(() => {
  console.log(1) // 1
  throw new Error('error') // rejected
}).catch(() => {
  console.log(2) // 2
}).catch(() => {
  console.log(3)
})

相关推荐:Cnc_zj的《普歌-事件循环


作者:Cnc_zj
本文源自:Cnc_zj的《普歌-Promise用法
本文版权归作者和CSDN共有,欢迎转载,且在文章页面明显位置给出原文链接,未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值