微信小程序中有些 Api 是異步的,沒法直接進行同步處理。例如:wx.request、wx.showToast、wx.showLoading等。若是須要同步處理,可使用以下方法:html
Async-await方法屬於ES7語法,在小程序開發工具中若是勾選es6轉es5, 會報錯:git
ReferenceError: regeneratorRuntime is not defined
避免報錯,能夠引入 regeneratores6
在根目錄下建立 lib 文件夾,並將 https://github.com/facebook/regenerator/tree/master/packages 裏面的 regenerator-runtime 文件夾放進去。github
而後在使用async-awiat的頁面中引入:小程序
// pages/list/list.js const regeneratorRuntime = require('../../lib/regenerator-runtime/runtime')
// request get 請求 const getData = (url, param) => { return new Promise((resolve, reject) => { wx.request({ url: url, method: 'GET', data: param, success (res) { console.log(res) resolve(res.data) }, fail (err) { console.log(err) reject(err) } }) }) } // request post 請求 const postData = (url, param) => { return new Promise((resolve, reject) => { wx.request({ url: url, method: 'POST', data: param, success (res) { console.log(res) resolve(res.data) }, fail (err) { console.log(err) reject(err) } }) }) } // loading加載提示 const showLoading = () => { return new Promise((resolve, reject) => { wx.showLoading({ title: '加載中...', mask: true, success (res) { console.log('顯示loading') resolve(res) }, fail (err) { reject(err) } }) }) } // 關閉loading const hideLoading = () => { return new Promise((resolve) => { wx.hideLoading() console.log('隱藏loading') resolve() }) } module.exports = { getData, postData, showLoading, hideLoading }
//app.js const api = require('./api/index') App({ onLaunch: function () { }, // 全局數據中暴露api globalData: { api } })
// pages/list/list.js const app = getApp() const api = app.globalData.api Page({ onLoad () { this.init() }, // 初始化 async init () { await api.showLoading() // 顯示loading await this.getList() // 請求數據 await api.hideLoading() // 等待請求數據成功後,隱藏loading }, // 獲取列表 getList () { return new Promise((resolve, reject) => { api.getData('http://127.0.0.1:3000/list', { x: '', y: '' }).then((res) => { this.setData({ list: res }) console.log(res) resolve() }) .catch((err) => { console.error(err) reject(err) }) }) }, })