• wx.request().then()不可用的解决方法


    微信小程序和服务器端的数据交互是通过wx.request()这个API函数来完成的,这是一个异步函数。

    在有些情况下,我们需要根据服务器传递回来的值来做下一个操作的时候,其代码都要写到success:function(res){ }函数中。

    如果success:function(res){ } 中又要调用wx.request(),就会碰到所谓的“回调地狱”,难以编码和维护。

    wx.request()还不支持Promise这种方式,也就是说不能用wx.request().then()的方式来处理数据,所以我们需要用Promise对wx.request()来做封装。

    使用Promise分两步:

    一 、先构造 Promise 对象,语法如下,Promise的构造函数用匿名函数 function(resolve, reject){ } 做参数,

    匿名函数的 resolve 和 reject 参数是执行成功和失败时要调用的函数:

    let pro = new Promise(function(resolve, reject) {   
        //do something.
    });

    二、然后在then方法中传入要回调的函数做下一步的处理,如下:

    pro.then(resolve, reject);

    将其应用到wx.request()上,即

    let baseOptions = (params, method = 'GET')=>{
        let { url, data } = params
        let contentType = 'application/x-www-form-urlencoded'
        contentType = params.contentType || contentType
        let pro = new Promise(function(resolve, reject) {
            wx.request({
                isShowLoading: true,
                loadingText: '正在加载',
                url: base + url,
                data: data,
                method: method,
                header: { 
                    'content-type': contentType,
                    'Authorization': wx.getStorageSync('token') 
                },
                success(res) {
                    if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
                        reject('请求资源不存在')
                    } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
                        reject('服务端出现了问题')
                    } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
                        reject('没有权限访问')
                    } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
                        if (res.data.code === HTTP_STATUS.TOKEN_EXPIRE) {
                            wx.clearStorageSync()
                            wx.reLaunch({
                                url:'/pages/index/index'
                            })
                            wx.showToast({
                                title: '登录状态过期,请重新登录',
                                icon:'none',
                                duration: 2000
                            })
                        }else if(res.data.code === HTTP_STATUS.AUTHENTICATE){
                            wx.clearStorageSync()
                            wx.reLaunch({
                                url:'/pages/index/index'
                            })
                            wx.showToast({
                                title: '认证失败,请重新登录',
                                icon:'none',
                                duration: 2000
                            })
                        }
                        else {
                            if(res.header.Authorization){
                                wx.setStorageSync('token',res.header.Authorization)
                            }
                            resolve(res.data)
                        }
                    }
                },
                fail(error) {
                    console.error(error)
                    if(error.errMsg === 'request:fail timeout'){
                        error.errMsg = '请求超时'
                    }
                },
                error(e) {
                    console.error('api', '请求接口出现问题', e)
                }
            })
        })
        return pro
    }
    
    export let get = (url, data = '')=>{
        let option = { url, data }
        return baseOptions(option)
    }
    
    export let post = function (url, data, contentType) {
        let params = { url, data, contentType }
        return baseOptions(params, 'POST')
    }

    调用代码为:

    getUserInfoByOpenId() {
      const openId = wx.getStorageSync('openid')
      get('/sysuser/getUserInfoByOpenId',{openId:openId}).then(
        res => {
          if(res.code === 200){
            this.setData({
              userInfo: res.data
            })
          }else {
            wx.showToast({
              title: res.message,
              icon: 'none',
              duration: 2000
            })
          }
        }
      ).catch((e) => {
        wx.showToast({
          title: e.errMsg,
          icon: 'none',
          duration: 2000
        })
      })
    }

    即相当于可使用wx.request().then()了。

  • 相关阅读:
    树莓派更新失败【sudo rpi-update】
    树莓派连接显示器没反应
    Linux命令
    Ansys Fluent报错:an error or interrupt occurred while reading the journal file
    Ansys Fluent从cmd命令行中打开后无法编译UDF【解决】
    Ansys Fluent中动网格运动时,网格被挤压和拉伸,不能及时重画网格而报错【解决】
    ANSYS Fluent中动网格里Event(事件)选项为灰色不可选【解决】
    ANSYS ICEM导入step模型报错【解决】
    win10关闭任务栏程序最近显示
    MATLAB %% 不分节
  • 原文地址:https://www.cnblogs.com/luoyihao/p/14704784.html
Copyright © 2020-2023  润新知