收藏
回答

封装request方法,同步的问题

//封装的方法

requestFunction:function(url,params){

    var obj;

    wx.request({

      url: url,

      data: params,

      method: 'get',

      header: {

        'content-type': 'application/x-www-form-urlencoded'

      },

      success: function (result) {

        console.log("返回值:"+result.data)

        obj =  result.data

      }

    })

    return obj;

  }


----------------但是现在的问题,这个是异步请求,我在调用方法获取到这个返回值的时候,返回值还没被赋值,大神们有没有啥解决方法

----------------不会同步。。。

回答关注问题邀请回答
收藏

9 个回答

  • Perry
    Perry
    2018-06-20

    网络请求是异步的,直接同步返回肯定出错。想省事,就把你这个方法加一个参数——回调函数即可。


    requestFunction:function(url,params,callback){
     
        wx.request({
     
          url: url,
     
          data: params,
     
          method: 'get',
     
          header: {
     
            'content-type': 'application/x-www-form-urlencoded'
     
          },
     
          success: function (result) {
     
            console.log("返回值:"+result.data)
     
            callback(result.data)
     
          }
     
        })
     
    }


    2018-06-20
    有用 3
    回复
  • ( ˙灬˙ )
    ( ˙灬˙ )
    2018-06-19
    import regeneratorRuntime from '../utils/regenerator-runtime/runtime-module'
    const wxRequest = async (url, params = {}) => {
      Object.assign(params, {token: wx.getStorageSync('token')})
      let data = params.query || {}
      wx.showLoading({
        title: '加载中...',
      })
      let res = await new Promise((resolve, reject) => {
        wx.request({
          url: url,
          method: params.method || 'GET',
          data: data,
          header: {
            'Content-Type': 'application/json',
            'token': params.token || ''
          },
          success: (res) => {
            if (res && res.statusCode == 200 && res.data) {
              resolve(res.data)
            } else {
              reject(res)
            }
          },
          fail: (err) => {
            wx.showModal({
              title: '网络出错,请稍后重试',
              showCancel: true
            })
            reject(err)
          },
          complete: (e) => {
            wx.hideLoading()
          }
        })
      })
      return res
    }
    module.exports = {
      wxRequest
    }

    用了async/await。仅供参考。

    2018-06-19
    有用 3
    回复 6
    • 祝通
      祝通
      2018-06-19

      谢大佬,可我不咋看得懂。。。。我用了Promise之后返回值是这样


      1. Promise  { [[PromiseStatus]] "pending" [[PromiseValue]] undefined }

        1. __proto__ : Promise

        2. [[PromiseStatus]] : " resolved "

        3. [[PromiseValue]] : " 测试i同步 "



      请问我怎么拿到value

      2018-06-19
      回复
    • ( ˙灬˙ )
      ( ˙灬˙ )
      2018-06-19

      。。。。用上了promise后你都要用异步的方法。。

      你自己先去看看promise的用法吧

      2018-06-19
      回复
    • ( ˙灬˙ )
      ( ˙灬˙ )
      2018-06-19回复祝通

      。。。。用上了promise后你都要用异步的方法。。

      你自己先去看看promise的用法吧。

      https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

      2018-06-19
      回复
    • 赵青山
      赵青山
      2018-06-21

      现在小程序能使用 async了?

      2018-06-21
      回复
    • ( ˙灬˙ )
      ( ˙灬˙ )
      2018-06-21回复赵青山
      import regeneratorRuntime from  '../utils/regenerator-runtime/runtime-module'


      引入这个。。

      2018-06-21
      回复
    查看更多(1)
  • 梁新维
    梁新维
    2018-06-19

    我是这样封装的

    /**
     * 封装 post 请求为 Promise
     * @param url
     * @param data
     * @param header
     * @returns {*|Promise<any>}
     */
    post: function (url, data, header = {}) {
      if (this.globalData.deviceSerialNumber) {
        header = {...header, 'device-serial-number': this.globalData.deviceSerialNumber};
      }
      return url && data && new Promise((resolve, reject) => {
        wx.request({
          url: url,
          method: 'POST',
          data: data,
          header: {
            'content-type': 'application/json', // 微信默认就是
            ...header
          },
          success: function (res) {
            resolve(res);
          },
          fail: function (res) {
            reject(res);
          }
        });
      });
    }


    2018-06-19
    有用 1
    回复 5
    • 祝通
      祝通
      2018-06-19
      1. Promise {[[PromiseStatus]]"pending"[[PromiseValue]]undefined}

        1. __proto__:Promise

        2. [[PromiseStatus]]:"resolved"

        3. [[PromiseValue]]:"测试i同步"


      我封装后获取的返回值是这种的。。。请问我怎么才能拿到value,我返回的值。。

      2018-06-19
      回复
    • 祝通
      祝通
      2018-06-19

      console.log("准备测试")



          var cc =

                  app.requestFunction("http://localhost:8080/selectTest.do", new Object(id = 12));

                 

          console.log(cc)



          console.log("结束测试")



      我是这样测试的

      2018-06-19
      回复
    • 梁新维
      梁新维
      2018-06-21回复赵青山

      这个不是 async,是 Promise 的写法

      2018-06-21
      回复
    • 祝通
      祝通
      2018-06-25

      嗯嗯,好的好的,谢谢,已经解决了,,

      2018-06-25
      回复
    • 似陈相识
      似陈相识
      2018-09-07回复祝通

      碰到和你一样的问题 你是怎么解决的?

      2018-09-07
      回复
  • 卢霄霄
    卢霄霄
    2018-06-19

    从外面传个回调方法进来?或者可以考虑使用 Promise

    2018-06-19
    有用 1
    回复 5
    • 祝通
      祝通
      2018-06-19
      1. Promise {[[PromiseStatus]]"pending"[[PromiseValue]]undefined}

        1. __proto__:Promise

        2. [[PromiseStatus]]:"resolved"

        3. [[PromiseValue]]:"测试i同步"


      我封装后获取的返回值是这种的。。。请问我怎么才能拿到value,我返回的值。。

      2018-06-19
      回复
    • 祝通
      祝通
      2018-06-19

      console.log("准备测试")



          var cc =

                  app.requestFunction("http://localhost:8080/selectTest.do", new Object(id = 12));

                 

          console.log(cc)



          console.log("结束测试")



      我是这样测试的

      2018-06-19
      回复
    • 卢霄霄
      卢霄霄
      2018-06-19回复祝通

      promise的基本用法哎,你最好百度下。

      requestFunction里要调在成功后用 resolve。

      var cc = app.requestFunction( "http://localhost:8080/selectTest.do" , new Object(id = 12 )).then((value)=>{

          // 这里是 resolve之后进来的

      })


      2018-06-19
      回复
    • 祝通
      祝通
      2018-06-19回复卢霄霄

      嗯嗯,我参数传递成功了,只是刚才想省一行,没想到这样不能传,又改回来了

      2018-06-19
      回复
    • 祝通
      祝通
      2018-06-19回复卢霄霄

      嗯嗯,我参数传递成功了,只是刚才想省一行,没想到这样不能传,又改回来了


      success: function (result) {

                console.log("返回值" + result.data)

                resolve(result.data)

              },

              fail: function (result){

                reject(result.data)

              }




      我在方法里这样写的 --------------


      返回值就是这种


      1. Promise  { [[PromiseStatus]] "pending" [[PromiseValue]] undefined }

        1. __proto__ : Promise

        2. [[PromiseStatus]] : " resolved "

        3. [[PromiseValue]] : " 测试i同步 "


      2018-06-19
      回复
  • 2018-06-28

    祝通,问题解决后的代码能不能贴出来让大家参考一下,从上看到下,不清楚你是怎么解决的,谢谢。

    2018-06-28
    有用
    回复 4
    • 祝通
      祝通
      2018-06-28

      呃。。。大佬。。我没解决啊。。。还是不会。。这个问题就先放下了。。不是不发。。

      2018-06-28
      回复
    • 2018-06-28回复祝通

      还以为你的问题已经解决了呢,关键是微信官方没有给相应的示例,让大家在这里摸索

      2018-06-28
      回复
    • 祝通
      祝通
      2018-06-28回复

      目前我了解的,好像就 promise 和 回调函数 但都不会用...


      2018-06-28
      回复
    • Alice
      Alice
      2019-10-16回复祝通
      你好,请问你最终解决了吗?我也遇到这个问题了好头痛啊,搞不懂
      2019-10-16
      回复
  • 任性༄🍎
    任性༄🍎
    2018-06-21

    你可以尝试了解下这个https://github.com/mushan0x0/wxapp-api-interceptors

    2018-06-21
    有用
    回复
  • 匿名
    匿名
    2018-06-21

    参考:https://www.jianshu.com/p/edd9a1aac8bd

    2018-06-21
    有用
    回复
  • 令狐不冲
    令狐不冲
    2018-06-20

    这种调用方式就很有问题吧,网络请求本来就是异步的,为什么要同步获取结果?

    2018-06-20
    有用
    回复 1
    • 宫圣云
      宫圣云
      2018-06-21

      因为有的业务的确是需要先获取服务器数据再处理,所以要拿到数据再继续处理,所以只能同步

      2018-06-21
      回复
  • oooo 👈
    oooo 👈
    2018-06-20

    // 请求公共数据使用

    // 仅供参考,return返回的是requestTask对象

     request: function ({ path, params = {}, cb, method = 'GET', header = { 'Accept': 'application/json' }, fail }) {
       var that = this
       return wx.request({
         url: that.yuming + path,
         method: method,
         data: params,
         header: header,
         success: function (res) {
           typeof cb == "function" && cb(res)
         },
         fail: function (err) {
           that.hideLoading()
           console.log('err', err)
           typeof fail == "function" && fail(err)
           if (err.errMsg == "request:fail abort") return
           wx.showToast({
             title: '请求出错,请稍候再试',
             image: '/images/err.png',
             duration: 1000,
             mask: true,
           })
         }
       })

     },



    2018-06-20
    有用
    回复
登录 后发表内容