讓小程序支持async-await

async-await是ES7的語法,截止我寫這篇文章爲止,小程序仍是不支持async-await語法的,因此須要使用regenerator這個庫html

  1. 下載regenerator,並把regenerator-runtime文件夾放到utils目錄下

圖片描述

  1. 在util.js引入import regeneratorRuntime from './regenerator-runtime/runtime-module'
  2. 封裝wxRequest,讓微信的wx.request API支持async-await語法
const wxRequest = async (url, params = {}) => {
  Object.assign(params, {
    token: wx.getStorageSync('token')
  })
  // 全部的請求,header默認攜帶token
  let header = params.header || {
    'Content-Type': 'application/json',
    'token': params.token || ''
  }
  let data = params.data || {}
  let method = params.method || 'GET'
  // hideLoading能夠控制是否顯示加載狀態
  if (!params.hideLoading) {
   wx.showLoading({
     title: '加載中...',
   })
  }
  let res = await new Promise((resolve, reject) => {
    wx.request({
      url: url,
      method: method,
      data: data,
      header: header,
      success: (res) => {
        if (res && res.statusCode == 200) {
          resolve(res.data)
        } else {
          reject(res)
        }
      },
      fail: (err) => {
        reject(err)
      },
      complete: (e) => {
        wx.hideLoading()
      }
    })
  })
  return res
}

export {
  wxRequest
}

封裝好後就能夠在js文件中使用了,使用方法以下:前端

import regeneratorRuntime from '../../utils/regenerator-runtime/runtime-module.js'
import {
  wxRequest
} from '../../utils/util.js'

Page({
  data: {
   list:[],
   count: 0,
   page: 1,
   limit: 10
  },
  onLoad: function() {
    this.getList()
    // 請求已經結束 作其餘事
  },
  getList: async function() {
    await wxRequest(app.globalData.baseUrl + '/test',{
      hideLoading: true,
      data: {
        limit: this.data.limit,
        page: this.data.page
      }
    }).then((ret) => {
      this.setData({
        list: ret.data.data,
        count: ret.data.num
      })
    })
  }
})

封裝帶來的最大的好處是擴展方便,支持了async/await語法後,任何異步操做API均可以像同步同樣執行,好比說多圖上傳,圖片都上傳成功後後端會返回新的圖片地址,如今能夠這麼作:git

任務:小程序上傳圖片到服務器,最多上傳三張,前端能夠刪除圖片github

效果圖以下json

使用到的API有兩個:wx.uploadFile wx.chooseImage小程序

示例WXML:segmentfault

<view class="sale after-pic">
  <block wx:for="{{imgList}}" wx:key="{{index}}">
    <view class="pic">
      <image src="{{item}}" />
      <icon type="clear" size="20" catchtap="clearImg" data-id="{{index}}"/>
    </view>
  </block>
  <image src="../../images/upload.png" catchtap="chooseImage" />
</view>
<button catchtap="onSub">提交</button>

imgList是wx.chooseImage成功後返回的圖片臨時地址後端

示例JS服務器

Page({
  data: {
    imgList:[]
  },
  onSub: async function() {
    // 點擊提交後,開始上傳圖片
     let imgUrls = []
     for (let index = 0; index < this.data.imgList.length; index++) {
       await this.uploadFile(this.data.imgList[index]).then((res) => {
         // 這裏要注意把res.data parse一下,默認是字符串
         let parseData = JSON.parse(res.data)
         imgUrls.push(parseData.data) // 圖片地址
       })
     }
     console.log(imgUrls) // 3張圖片上傳成功後,執行其餘操做
  },
  // 刪除某張圖片
  clearImg: function (params) {
    let imgList = this.data.imgList
    let id = params.currentTarget.dataset.id // 圖片索引
    imgList.splice(id, 1) // 刪除
    this.setData({
      imgList: imgList
    })
  },
  chooseImage: function (params) {
    wx.chooseImage({
      count: 3, // 作多3張
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        // 存儲臨時地址
        this.setData({
          imgList: res.tempFilePaths
        })
      }
    })
  },
  uploadFile: function (filePath) {
    // 返回Promise是爲了解決圖片上傳的異步問題
    return new Promise( (resolve, reject) => {
      wx.uploadFile({
        url: app.globalData.baseUrl + '/file/upload', // 上傳地址
        filePath: filePath,
        name: 'file', // 這裏的具體值,問後端人員
        formData: {},
        header: {
          "Content-Type": "multipart/form-data"
        },
        success: (res) =>{
          resolve(res.data)
        },
        fail:(err) => {
          reject(err)
        }
      })
    })
  }
})

wx.uploadFile()是異步執行的,可是有了async-await的支持,輕鬆搞定異步等待的問題微信

更多開發總結移步於此

相關文章
相關標籤/搜索