我在app.js处调用api,getDistrict()方法获取一些全局数据,写入storage里面备用。但是api数据不大,也就180B。
index.js需要调用getDistrict返回的数据。在手机调试下,getDistrict总是比后面的方法要执行慢,导致后面的数据需要用到getDistrict里面的数据又没法调用。
而在开发者工具下始终是正常的。因为在开发者工具下始终是getDistrict先完成,才执行index.js里面的方法。下面两个图可以反映这个情况。
有没有办法可以让getDistrict()执行完 全局数据加载以后再往下走?
这里也有一个问题,同样的代码,在手机上模拟时,获取api的时序是这样的,此时不能正确加载全局数据:
在开发者工具上,试了N次,始终是getDistrict先执行再执行下面的方法,这样程序就能正常运行:
为什么手机端和开发者端差异这么大。。
技术水平问题。然后骂街。也是6666
仅供参考
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
});
});
}
}
});
其实吧 我建议你存储用异步存,同步去获取。
骚年,这么基础的东西要怪自己,js基础多看看吧
建议使用 getDistrict 的地方前面先判断有没有getDistrict数据,没有的话就先调用getDistrict数据或者延时下再获取index的数据
这是用户提交反馈前先判断有没有用户相关的信息t是app.js
下面是app。js中的CSK的定义
如果用户数据存在(sessionKey)存在,直接执行回调,不存在去获取用户信息,获取三次仍然失败返回网络错误,返回成功继续回调需要的数据
感谢指导!
新手开发???你这个问题有三种方法解决
1、通过getcurrentpage设置当前页数据,亦可调用当前页函数,我这说应该能看懂吧,意思就是在app.js里可以获取到当前页面对象,这样你就可以在app的异步回调里直接调用当前页面的函数了
2、不说了留一手 😁
感谢指导!
你加个globalData,index里setInterval判断这个变量有没有变化,变化了就执行下一步
感谢指导!
你还是没有理解异步同步的概念,虽然app.js 先执行,但wx.request是异步,在indexjs执行的时候并不能保证request回调执行,即使开发者工具也是一样,你在后端接口写个定时延迟返回数据,在开发者工具就会重现这个问题,建议写在入口页面,然后给appGlobalData赋值
你还是贴下代码吧,很多api是异步的,才造成你这个问题
我补充了问题说明。我也知道是异步造成的。这个问题在开发者工具中貌似不存在,就是在手机调试的时候,会有问题。
我刚写完代码片段发现不能通过手机调试,囧
只要严格用回调,有顺序执行,就不会有问题。
但是问题就是这么产生了。。
我的思路是,app.js是入口,那我通过app.js里面的方法,去获得一些全局数据,写到storage里面。后面的页面,可以通过读取 storage里面的全局输入来调用相关的数据。
执行顺序肯定是对的,但是结果就是这么奇怪。。
不奇怪啊,因为有些操作是异步的,贴代码就是了
代码如下:
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是可以正常加载的。到了手机端就废了
提供不了代码片段了,因为这种错误的方式,仅在手机端上 有所体现。在开发者工具上,无论怎么试,都不会出问题。而代码片段无法通过手机执行。。
那不能粘贴复制吗
代码片段里的东西复制到一个项目里面不就行了,开发工具和手机本来就是完全不同的两个东西,差异大是正常的