收藏
回答

wx.request 太坑啦,有没有解决方案

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 Bug wx.request 工具 6.7.1 2.2.1

我在app.js处调用api,getDistrict()方法获取一些全局数据,写入storage里面备用。但是api数据不大,也就180B。


index.js需要调用getDistrict返回的数据。在手机调试下,getDistrict总是比后面的方法要执行慢,导致后面的数据需要用到getDistrict里面的数据又没法调用。


而在开发者工具下始终是正常的。因为在开发者工具下始终是getDistrict先完成,才执行index.js里面的方法。下面两个图可以反映这个情况。


有没有办法可以让getDistrict()执行完 全局数据加载以后再往下走?


这里也有一个问题,同样的代码,在手机上模拟时,获取api的时序是这样的,此时不能正确加载全局数据:



在开发者工具上,试了N次,始终是getDistrict先执行再执行下面的方法,这样程序就能正常运行:



为什么手机端和开发者端差异这么大。。

最后一次编辑于  2018-07-19
回答关注问题邀请回答
收藏

10 个回答

  • A_Lixin
    A_Lixin
    2018-07-19

    技术水平问题。然后骂街。也是6666



    2018-07-19
    赞同 2
    回复
  • SHIELD
    SHIELD
    2018-07-20

    仅供参考

    app.js:
    App({
        globalData: {
            dst_list: []
        },
        onLaunch: function () {
        },
        getDistrict: function (callback) {
            var that = this ;
            wx.request({
                url: 'http://aaa.com/api/index/getDistrict' ,
                method: 'post' ,
                data: {},
                header: {
                    'content-type' : 'application/x-www-form-urlencoded' ,
                    'Accept' : 'application/json'
                },
                success: function (response) {
                    var ret = response.data;
                    if (ret.code == 1 ) {
                        var dst_id = ret.data.dst_id;
                        var dst_index = ret.data.dst_index;
                        that.globalData.dst_list = ret.data.dst_list;
                        if (callback) callback(response);
                    }
                }
            });
        }
    });
     
    index.js:
    const app = getApp();
    Page({
        data: {
            dst_list: []
        },
        onLoad: function () {
            var that = this ;
            if (app.globalData.dst_list.length > 0) {
                that.setData({
                    dst_list: app.globalData.dst_list
                });
            } else {
                app.getDistrict(function (res) {
                    that.setData({
                        dst_list: app.globalData.dst_list
                    });
                });
            }
        }
    });


    2018-07-20
    赞同 1
    回复
  • 仙森ღ₅₂₀¹³¹⁴
    仙森ღ₅₂₀¹³¹⁴
    2018-07-23

    其实吧 我建议你存储用异步存,同步去获取。

    2018-07-23
    赞同
    回复
  • zzc
    zzc
    2018-07-20

    骚年,这么基础的东西要怪自己,js基础多看看吧

    2018-07-20
    赞同
    回复
  • 李良山
    李良山
    2018-07-19

    建议使用 getDistrict 的地方前面先判断有没有getDistrict数据,没有的话就先调用getDistrict数据或者延时下再获取index的数据

    这是用户提交反馈前先判断有没有用户相关的信息t是app.js


    下面是app。js中的CSK的定义


    如果用户数据存在(sessionKey)存在,直接执行回调,不存在去获取用户信息,获取三次仍然失败返回网络错误,返回成功继续回调需要的数据


    2018-07-19
    赞同
    回复 1
    • December.
      December.
      2018-07-20

      感谢指导!

      2018-07-20
      1
      回复
  • 古星
    古星
    2018-07-19

    新手开发???你这个问题有三种方法解决

    1、通过getcurrentpage设置当前页数据,亦可调用当前页函数,我这说应该能看懂吧,意思就是在app.js里可以获取到当前页面对象,这样你就可以在app的异步回调里直接调用当前页面的函数了

    2、不说了留一手 😁

    2018-07-19
    赞同
    回复 1
    • December.
      December.
      2018-07-20

      感谢指导!

      2018-07-20
      回复
  • Noah's Ark
    Noah's Ark
    2018-07-19

    你加个globalData,index里setInterval判断这个变量有没有变化,变化了就执行下一步

    2018-07-19
    赞同
    回复 1
    • December.
      December.
      2018-07-20

      感谢指导!

      2018-07-20
      回复
  • 木剑温小二
    木剑温小二
    2018-07-19

    你还是没有理解异步同步的概念,虽然app.js 先执行,但wx.request是异步,在indexjs执行的时候并不能保证request回调执行,即使开发者工具也是一样,你在后端接口写个定时延迟返回数据,在开发者工具就会重现这个问题,建议写在入口页面,然后给appGlobalData赋值

    2018-07-19
    赞同
    回复
  • 卢霄霄
    卢霄霄
    2018-07-19

    你还是贴下代码吧,很多api是异步的,才造成你这个问题

    2018-07-19
    赞同
    回复 10
    • December.
      December.
      2018-07-19

      我补充了问题说明。我也知道是异步造成的。这个问题在开发者工具中貌似不存在,就是在手机调试的时候,会有问题。


      我刚写完代码片段发现不能通过手机调试,囧

      2018-07-19
      回复
    • 卢霄霄
      卢霄霄
      2018-07-19回复December.

      只要严格用回调,有顺序执行,就不会有问题。

      2018-07-19
      回复
    • December.
      December.
      2018-07-19回复卢霄霄

      但是问题就是这么产生了。。


      我的思路是,app.js是入口,那我通过app.js里面的方法,去获得一些全局数据,写到storage里面。后面的页面,可以通过读取 storage里面的全局输入来调用相关的数据。


      执行顺序肯定是对的,但是结果就是这么奇怪。。

      2018-07-19
      回复
    • 卢霄霄
      卢霄霄
      2018-07-19回复December.

      不奇怪啊,因为有些操作是异步的,贴代码就是了

      2018-07-19
      回复
    • December.
      December.
      2018-07-19回复卢霄霄

      代码如下:

      app.js:

      onLaunch: function () {

      this.getDistrict();

      },

      getDistrict: function () {

          var that = this;

          wx.request({

          url: 'http://aaa.com/api/index/getDistrict',

          method: 'post',

          data: {},

          header: {

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

              'Accept': 'application/json'

          },

          success: function (response) {

              var ret = response.data;

              if (ret.code == 1) {

                  var dst_id = ret.data.dst_id;

                  var dst_index = ret.data.dst_index;

                  wx.setStorageSync('dst_list', ret.data.dst_list);

              }

          }

      });

      }


      index.js:

      onLoad: function () {

          var that = this;

          var dst_list = wx.getStorageSync('dst_list');

          that.setData({

              dst_list: dst_list,

          });

      },



      //------------------------------------------//

      代码就是这样了,在开发者工具上dst_list是可以正常加载的。到了手机端就废了


      2018-07-19
      回复
    查看更多(5)
  • December.
    December.
    2018-07-19

    提供不了代码片段了,因为这种错误的方式,仅在手机端上 有所体现。在开发者工具上,无论怎么试,都不会出问题。而代码片段无法通过手机执行。。

    2018-07-19
    赞同
    回复 2
    • 健康和平安是最重要的
      健康和平安是最重要的
      2018-07-19

      那不能粘贴复制吗

      2018-07-19
      回复
    • 辣油甩放
      辣油甩放
      2018-07-20

      代码片段里的东西复制到一个项目里面不就行了,开发工具和手机本来就是完全不同的两个东西,差异大是正常的

      2018-07-20
      回复
登录 后发表内容