近期开发微信小程序涉及到wx.request()网络请求,原代码为:
// pages/index/home.js var temp_data ; Page({ /** * 页面的初始数据 */ data: { items:[] }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { // 页面初始化后发出新的请求 wx.request({ url: "http://2327.free.ngrok.cc/Note_api/plist", data: { "token": getApp().globalData.userInfo.dev_token, "usertoken": wx.getStorageSync("usertoken") }, method: "POST", header: { "content-type": "application/x-www-form-urlencoded" }, success: function(res){ if(res.data.status == 1){ temp_data = res.data.diaryDatas; }else{ wx.showToast({ title: res.data.message, icon: "loading", duration: 2000 }) } } }) }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { //页面渲染完成 this.setData({ items: temp_data }) } })
本想在onLoad()函数中获取数据,在onReady()函数中设置刷新数据 ,结果控制台打印的信息却是 undefined,,
items并没有被赋值,什么原因呢?一开始以为是服务器返回的值不符合json数据格式,后来证明没问题。然后分别打印success()函数中的数据和onReady()函数数据,发现程序先执行了success函数
事实是onLoad函数先执行,之后执行onReady函数,这里可能是由于wx.request()是多线程网络请求,所以造成了数据不统一,即赋值给items的temp_data是初始值,并没有将服务器返回的数据赋值给他,
后来改为:
这里注意的是 ,在success函数中调用this.setdata()函数时,不能直接用this调用,应该是在success函数中this指代意义不同,所以将this赋值给me,用me调用,否则会报如图错误。/** * 生命周期函数--监听页面加载 */ onLoad: function (options) { // 页面初始化后发出新的请求 var me = this; wx.request({ url: "http://2327.free.ngrok.cc/Note_api/plist", data: { "token": getApp().globalData.userInfo.dev_token, "usertoken": wx.getStorageSync("usertoken") }, method: "POST", header: { "content-type": "application/x-www-form-urlencoded" }, success: function(res){ if(res.data.status == 1){ temp_data = res.data.diaryDatas; console.log(temp_data); me.setData({ items: temp_data }) console.log(me.data.items); }else{ wx.showToast({ title: res.data.message, icon: "loading", duration: 2000 }) } } }) },
这样问题就解决了。