微信小程序异步请求封装方案
Posted 杨杨杨杨杨杨杨振
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序异步请求封装方案相关的知识,希望对你有一定的参考价值。
1.使用callback
1.config.js 定义配置信息
请求的通用信息
const config = {
appkey:\'zCr1cdeqweq\',
apiBaseUrl:\'http://localhost:5300\'
}
export {
config
}
2.在utils包中定义http.js
import { config } from \'../config/config\'
class Http {
static request({url, data, callback, method=\'GET\'}){
wx.request({
url:`${config.apiBaseUrl}${url}`,
data,
header:{
appkey:config.appkey
},
success:res=>{
callback(res.data) //使用回调函数将数据传出去
}
})
}
}
3.在model包中定义theme.js (业务对象)
import { Http } from \'../utils/http\';
class Theme{
//获取首页LocationA
static getHomeLocationA(callback){
Http.request({
url:`/theme`,
data:{
name:\'t-1\',//请求的参数
},
callback:data=>{
callback(data) //回调函数中嵌套回调函数
}
})
}
}
4.在home.js 调用
import { Theme } from \'../../model/theme\'
onLoad: function (options) {
Theme.getHomeLocationA(data=>{
this.setData({
topTheme:data[0]
})
})
},
分析可知 使用callback函数会出现函数嵌套
2.使用Promise
1.使用Promise封装Http.js
import { config } from \'../config/config\'
class Http{
static request({url, data, method=\'GRT\'}){
return new Promise((resolve,reject)=>{
wx.request({
url: `${config.apiBaseUrl}${url}`,
data,
method,
header: {
appkey: config.appkey
},
success:res=>{
resolve(res.data);
},
fail:err=>{
reject(err)
}
})
})
}
}
2.改写theme.js
import { Http } from \'../utils/http\';
class Theme {
static getHomeLocationA(params) {
return Http.request({
url: `/themes`,
data: {
names: params
}
})
}
}
3.home.js
onLoad: function (options) {
Theme.getHomeLocationA(\'t-1\').then((data)=>{
this.setData({
topTheme:data[0]
})
})
}
3.终级解决方案 async await
为了解决大量复杂不易读的Promise异步的问题,才出现的改良版
async必须声明的是一个function
async声明的函数的返回本质上是一个Promise。
await是在等待一个Promise的异步返回
1.将小程序内置非promise API转化为Promise请求
const promisic = function(func) {
return function(params= {}) {
return new Promise((resolve,reject)=> {
const args = Object.assign(params,{
success:res=>{
resolve(res)
},
fail:err=>{
reject(err)
}
})
func(args);
})
}
}
export {
promisic
}
2.改写http.js
import { config } from \'../config/config\'
import { promisic } from \'./util\'
class Http {
static async request({url, data, method = \'GET\'}){
return await promisic(wx.request)({
url: `${config.apiBaseUrl}${url}`,
data,
method,
header: {
appkey: config.appkey
},
})
}
}
export {
Http
}
3.theme.js
import { Http } from \'../utils/http\';
class Theme {
static async getHomeLocationA() {
const res = await Http.request({
url: `/themes`,
data: {
names: \'t-1\'
}
})
return res.data
}
}
export {
Theme
}
4.home.js
onLoad: async function (options) {
const data = await Theme.getHomeLocationA();
this.setData({
topTheme:data[0]
})
},
使用了 async await 异步函数 变成了同步函数调用
以上是关于微信小程序异步请求封装方案的主要内容,如果未能解决你的问题,请参考以下文章