async-await是ES7的語法,截止我寫這篇文章爲止,小程序仍是不支持async-await語法的,因此須要使用regenerator這個庫html
import regeneratorRuntime from './regenerator-runtime/runtime-module'
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的支持,輕鬆搞定異步等待的問題微信
更多開發總結移步於此