js Promise的基本使用

从语法上来说: Promise 是一个构造函数

从功能上来说: promise 对象用来封装一个异步操作并可以获取其成功 / 失败的结果值

  • Promise是一个构造函数,通过 new 操作符可创建一个 promise 实例
  • 该构造函数接收一个函数作为参数,这个函数我们通常称为执行器(executor)函数
  • 执行器函数接收两个参数:这两个参数作为函数可调用并可以传入相应数据,通常我们以resolvereject进行命名
    • 第一个参数 resolve :异步操作执行成功后的回调函数
    • 第二个参数 reject:异步操作执行失败后的回调函数
const promise = new Promise((resolve, reject) => { // 执行器
  // 异步操作
  setTimeout(() => {
    const rand = Math.random() * 100
    // 模拟成功或失败
    if (rand >= 50) {
        // 成功时执行
      resolve()
    } else {
        // 失败时执行
      reject()
    }
  }, 1000)
})

 

resolve函数的作用:

promise实例的状态从 pending 变为 fulfilled,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去

reject函数的作用:

将 promise 实例的状态从 pending 变为 rejected,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

promise实例具有三种状态

  • pending(进行中,最初状态)
  • resolved:(已成功,有时候也称为fulfilled)
  • rejected:(已失败)

 

then 方法

Promise原型对象上具有then方法,该方法是为 promise 实例指定处理程序的主要方法,promise 实例可以直接调用,then 方法接收两个可选参数(onResolved 处理程序,onRejected 处理程序),该方法返回一个新的 promise 实例

  • 提供第一个参数onResolved处理程序:fulfilled状态的回调函数
  • 提供第二个参数onRejected处理程序:rejected状态的回调函数
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const rand = Math.random() * 100
    if (rand >= 50) {
        // 执行resolve 并传入相应数据
      resolve({name: 'James', age: 36})
    } else {
       // 执行reject 并传入异常
      reject(new Error('Error'))
    }
  }, 1000)
})

promise.then(
  (value) => {
    // 当promise实例的状态为 fulfilled 时执行
    console.log('执行成功时的结果值数据', value)
  },
  (error) => {
    // 当promise实例的状态为 rejected 时执行
    console.log('执行失败时的结果值数据', error)
  }
)

因为 promise 实例的状态发生改变,只会存在一种结果,传入两个处理程序,要么状态变为 fulfilled,onResolved 执行,要么状态变为 rejected,onRejected 执行。当然,若状态永远处于pending,则这两个处理程序都不会执行

关于链式调用

前面我们提到,then方法最终会返回一个新的 promise 实例,因此可以进行链式调用,将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数.

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve({name: 'James', age: 36})
  }, 1000)
})

promise.then(
  (value) => {
    console.log('onResolved1', value)
    return value
  },
).then(
  (value) => {
    console.log('onResolved2', value)
    return value
  },
).then(
  (value) => {
    console.log('onResolved3', value)
    return value
  }
)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值