Promise基本用法


Promise基本概念

Pormise是JS的异步编程的一种解决方案,在ES6将其写进了语言标准,提供了原生的Promise对象。

Promise简单来理解就是一个容器,里面存放着某个未来才会结束的事件结果。Promise是一个对象,从它可以获取异步操作的消息,Promise提供了统一的API,各种异步操作都可以用同样的方法进行处理。

Promise是个对象,有三种状态

  • pending:进行中,在new Promise()的时候
  • fulfilled:已成功,resolve会将进行中变成已成功
  • rejected:已失败,reject会将进行中变成已失败

Promise使用

  1. 初始化的时候需要传递一个函数,这个函数有两个参数,两个参数也是函数。需要执行的异步代码放在传递的函数中

    let promise = new Promise((resolve, reject) => {
      wx.getSystemInfo({
        success: (res) => {
          // 修改成已成功的状态
          resolve(res)
        },
        fail: (err) => {
          // 修改成已失败的状态
          reject(err)
        }
      })
    })
    
    promise.then((res) => {
      console.log(res)
    }, (err) => {
      console.log(err)
    })
  2. promise.then()方法获取结果,接收两个参数,两个参数不可以更换位置

    1. 第一个是已成功的回调函数
    2. 第二个是已失败的回调函数

上面代码简写

new Promise((resolve, reject) => {
  wx.getSystemInfo({
    // 修改成已成功的状态
    success: res => resolve(res),
    // 修改成已失败的状态
    fail: err => reject(err)
  })
}).then(res => console.log(res), err => console.log(err))

Promise正确写法

如果出现几个Promise一起使用,则可以在Promise函数中return另外一个Promise对象,避免回调地狱。

bookModel.getHotList().then(res => {
  console.log("1." + JSON.stringify(res))
  // 如果需要在回调中发起另外的请求,则返回一个Promise
  return bookModel.getMyBookCount()
}).then(res => {
  console.log("2." + JSON.stringify(res))
  return bookModel.getMyBookCount()
}).then(res => {
  console.log("3." + JSON.stringify(res))
})

Promise.all使用

如果用三个请求发送,串行的

bookModel.getDetail(bid).then(res => {
  this.setData({
    book: res
  })
})
bookModel.getCommons(bid).then(res => {
  this.setData({
    comments: res.comments
  })
})
bookModel.getLikeStatus(bid).then(res => {
  this.setData({
    likeStatus: res.like_status,
    likeCount: res.fav_nums
  })
})

用Promise.all方法改写

Promise.all([bookModel.getDetail(bid), bookModel.getCommons(bid), bookModel.getLikeStatus(bid)]).then(res => {
  wx.hideLoding()
  this.setData({
    book: res[0],
    comments: res[1].comments,
    likeStatus: res[2].like_status,
    likeCount: res[2].fav_nums
  })
})

res返回的是数组,数组的顺序就是all的参数数组的数据。


Author: Re:0
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Re:0 !
 Previous
线程池详解 线程池详解
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。线程池使用场景:并行操作,异步提交等
2022-03-30
Next 
数据访问对象模式 数据访问对象模式
定义数据访问对象模式(Data Access Object Pattern)又称为 DAO 模式,是一种面向对象的数据访问接口,DAO 一般都是和数据库打交道,属于业务逻辑和数据库中间的环节,负责业务逻辑数据的持久化。
2022-03-18
  TOC