您现在的位置是:首页 > 用Promise封装UniApp的request请求

用Promise封装UniApp的request请求

jry 2019-07-01 10:31 3900人围观 来源:原创
uniapp   promise   async   await  
简介UniApp默认的request方法是带有回调的异步方法,实际使用中代码有些冗余,而且嵌套较多很容易陷入回调地狱,本文用Promise结合async/await关键字实现用同步代码实现异步逻辑。

刚刚发现官方现在已经自己支持了,可以直接用不用像下面这样封装了,不过封装也不影响。

在/libs/util.js里封装request方法如下:

注意下面示例代码使用jwt生成的token作为登录凭证

let util = {};

//  获取用户登录凭证token
util.getToken = function () {
    return uni.getStorageSync('token')
};

// request
util.request = function ({
    method = "GET",
    url,
    data,
    success,
    fail,
    complete
}) {
    // 请求
    if (0 != url.indexOf("http")) {
        url = util.baseUrl() + url
    }
    var header = {
        'content-type': 'application/json',
        'Authorization': util.getToken()
    }
    return new Promise((resolve, reject) => {
        uni.request({
            url: url,
            method: method,
            data: data,
            header: header,
            dataType: 'json',
            success: success,
            fail: (res) => {
                let ret = new Object()
                ret.code = 0
                // ret.msg = res.errMsg
                ret.msg = '接口或网络异常'
                reject(ret)
            },
            complete: (res) => {
                if (res.statusCode === 200) { //成功
                    if (res.data.data) {
                        if (res.data.code== -1) {
                            alert('请先登录系统')
                        }
                    }
                    resolve(res.data)
                } else {
                    let ret = new Object()
                    ret.code = 0
                    ret.msg = res.errMsg
                    reject(ret)
                }
            }
        })
    });
};

export default util;

在main.js中引入util这样就不需要在每个页面都引入util了:

import Vue from 'vue'
import App from './App'
import store from './store'
Vue.prototype.$store = store

// 这里全局引入util工具
import util from './libs/util';
Vue.prototype.util = util

Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
    store,
    ...App
})
app.$mount()
export default app

来看一个封装前调用request有4层嵌套的示例:


async onShow() {
    this.util.request({
        url: '/api1',
        data: {
            id: id
        },
        success: res => {
            if (res.data.status === 1) {
                until.ly_request({
                    url: '/api2',
                    data: {
                        id: id
                    },
                    success: res => {
                        if (res.data.status === 1) {
                            until.ly_request({
                                url: '/api3',
                                data: {
                                    id: id
                                },
                                success: res => {
                                    if (res.data.status === 1) {
                                        until.ly_request({
                                            url: '/api4',
                                            data: {
                                                id: id
                                            },
                                            success: res => {
                                                if (res.data.status === 1) {
                                                    /api1
                                                } else if (res.data.status === 0) {
                                                    console.log(res.data.info)
                                                    uni.showToast({
                                                        title: '请选择学校',
                                                        icon: 'none',
                                                        duration: 1500
                                                    });
                                                }
                                            }
                                        })
                                    } else if (res.data.status === 0) {
                                        console.log(res.data.info)
                                        uni.showToast({
                                            title: '请选择学校',
                                            icon: 'none',
                                            duration: 1500
                                        });
                                    }
                                }
                            })
                        } else if (res.data.status === 0) {
                            console.log(res.data.info)
                            uni.showToast({
                                title: '提示',
                                icon: 'none',
                                duration: 1500
                            });
                        }
                    }
                })
            } else if (res.data.status === 0) {
                uni.showToast({
                    title: '提示',
                    icon: 'none',
                    duration: 1500
                });
            }
        }
    })
}

封装request后完成同样的功能代码示例:


async onShow() {
    let res = await this.util.request({
        url: '/api1',
        method: 'get',
        data: {
            id: id
        }
    });
    if (res.data.status != 1) {
        uni.showToast({
            title: '提示',
            icon: 'none',
            duration: 1500
        });
    }

    let res2 = await this.util.request({
        url: '/api2',
        method: 'get',
        data: {
            id: id
        }
    });
    if (res2.data.status != 1) {
        uni.showToast({
            title: '提示',
            icon: 'none',
            duration: 1500
        });
    }

    let res3 = await this.util.request({
        url: '/api3',
        method: 'get',
        data: {
            id: id
        }
    });
    if (res2.data.status != 1) {
        uni.showToast({
            title: '提示',
            icon: 'none',
            duration: 1500
        });
    }

    let res4 = await this.util.request({
        url: '/api4',
        method: 'get',
        data: {
            id: id
        }
    });
    if (res2.data.status != 1) {
        uni.showToast({
            title: '提示',
            icon: 'none',
            duration: 1500
        });
    }
}

 

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cn0udci9ym88

文章评论