Promise 处理异步操作的js标准内置对象

9 篇文章 0 订阅

Promise 处理异步操作的js标准内置对象

基础用法

Promise 用来处理异步操作的js标准内置对象,到了ES2017有更高级的async/await来处理异步操作
创建并使用一个promise

// 创建promise对象
let pro = new Promise((resolve, reject) => {
  setTimeout(() =>  {
    // 正常完成
    resolve('success')
    // 异常情况
    //reject('fail')
  }, 500)
})
// 使用promise对象
pro.then(res => {
  // 正常完成
  console.log(res)
}).catch(err => {
  // 异常情况
  console.log(err)
}).finally(() => {
  // 正常异常都会执行
})

常见的写法还有通过函数返回一个promise

// 定义函数
function getApi() {
  return new Promise((resolve, reject) => {
    setTimeout(() =>  {
      resolve('success')
    }, 500)
  })
}
// 使用
getApi().then(res => {
  console.log(res)
})

进阶

批量处理多个异步操作

Promise.all([pro1, pro2, pro3])

Promise.all([pro1, pro2, pro3]) 传入多个promise

返回一个promise pro4

pro4.then为全部执行成功的结果数组

pro1, pro2, pro3中任意一个执行reject则进入catch

let pro1 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro1')
  }, 500)
})
let pro2 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro2')
  }, 100)
})
let pro3 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro3')
  }, 500)
})

Promise.all([pro1, pro2, pro3]).then(results => { // 全部执行成功
  results.forEach(item => {
    console.log(item)
  })
}).catch(reason => { // reason为第一个执行reject的异常结果
  console.log(reason)
})

// 运行结果:
// pro1
// pro2
// pro3

Promise.allSettled([pro1, pro2, pro3])

与Promise.all()类似,区别在于Promise.allSettled()会返回所有的执行结果,无论是否成功

let pro1 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro1')
  }, 500)
})
let pro2 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro2')
  }, 100)
})
let pro3 = new Promise((resolve, reject) => {
  setTimeout(function () {
    reject('pro3') // 执行失败处理
  }, 500)
})

Promise.allSettled([pro1, pro2, pro3]).then(results => { // 全部执行成功
  results.forEach(item => {
    console.log(item)
  })
}).catch(reason => { // reason为第一个执行reject的异常结果
  console.log(reason)
})

// 运行结果:
// { status: 'fulfilled', value: 'pro1' }
// { status: 'fulfilled', value: 'pro2' }
// { status: 'rejected', reason: 'pro3' }

Promise.race([pro1, pro2, pro3])

无论成功失败,返回最先执行完成的promise的执行结果

let pro1 = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve('pro1')
  }, 500)
})
let pro2 = new Promise((resolve, reject) => {
  setTimeout(function () {
    reject('pro2')
  }, 100)
})
Promise.race([pro1, pro2]).then(results => {
	console.log(item) // 未被调用
}).catch(reason => {
  console.log(reason) // pro2最先执行完成,所以运行结果:pro2
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bdawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值