添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
微信小程序(4)- Promise封装http请求

微信小程序(4)- Promise封装http请求

3 年前 · 来自专栏 前端小知识温故而知新

使用Promise封装http请求的原因:

1、微信的wx.request采用回调方式处理返回结果,异步操作比较多的时候容易进入回调地狱。

2、统一处理返回结果,包括错误处理以及返回数据处理。

3、可读性差别。


Promise

主要用于异步计算

1、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

2、可以在对象之间传递和操作promise,帮助我们处理队列

// promise 有三种状态,pending-运行中  fulfilled-成功  reject-失败
// 状态是可以修改的,当指定状态后状态就固定不会改变了
const promise = new Promise((resolve, reject) => {
    // todo
    success: (res) => { resolve(res) },
    fail: (err) => { reject(err) }
Promise.then( (res) => { console.log(res) },(err) => {console.log(err)})
// 这里then拿到的就是前面获取到的数据

接下来咱们开始使用promise封装wx.request,http-p.js

// utils下新建http-p.js文件
// baseurl 是 接口请求url的管理文件
import { base } from './baseurl.js'
// 根据后台返回的status来指定错误提示对象
const tips = {
    1: '网络错误,请稍后尝试',
    1005:'appkey无效',
    403:'重定向'
// 使用class类的概念
class HTTP{
    // 利用promise封装包装_rquest,传参用到解构
    request({url, data={}, method='GET'}){
        return new Promise((resolve, reject) => {
            this._request(url, resolve, reject, data, method)
    //内部函数
    _request(url, resolve, reject, data={}, method='GET'){
        wx.request({
            url: base.url + url,
            method:method,
            data:data,
            header:{
                'content-type':'application/json'
            success:(res) => {
                // 处理返回值
                // startsWith  endWith
                console.log('res');
                console.log(res);
                const code = res.statusCode.toString(); // 获取code
                if (code.startsWith('2')){
                    resolve(res.data)
                else{
                    reject()
                    let error_code = res.data.error_code
                    this._show_error(error_code)
            fail:(err)=>{
                reject()
                this._show_error(1)
    // 内部错误处理函数
    _show_error(error_code){
        if(!error_code){
            error_code = 1
        const tip = tips[error_code]
        wx.showToast({
            title: tip?tip:tips[1], 
            icon:'none',
            duration:2000
export { HTTP }

封装好了以后,再建立model层来接受处理返回数据(model层才是接受返回数据的地方,这样页面只需要引入model层里需要的数据拿来用就好了)mine.js

// 根目录新建model文件夹
// model文件夹下创建第一个model.js(根据自己的page来分类)
// 引入http-p
import { HTTP } from '../utils/http-p.js'
// 同样适用class类的模式创建自己的model模块,并继承HTTP
class MineModel extends HTTP{
    // 创建方法
    getMineList(){
        // return 返回处理后接过
        // 传参这块,因为http-p里面用到来解构来处理参数,所以这边可以直接传对象
        return this.request({
            url:'book/hot_list'
export { MineModel }

page页面使用

import { MineModel } from '../../model/mine.js'
const mineModel = new MineModel();
Page({
  data: {
    list:[]
  onLoad: function () {
    const hotList = mineModel.getMineList()
    hotList.then(res => {
      this.setData({