微信小程序开发笔记之wx.request()的坑——将服务器返回的数据及时显示到视图层

近期开发微信小程序涉及到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是初始值,并没有将服务器返回的数据赋值给他,

后来改为:
/**
   * 生命周期函数--监听页面加载
   */
  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
          })
        }
      }
    })
  },

这里注意的是 ,在success函数中调用this.setdata()函数时,不能直接用this调用,应该是在success函数中this指代意义不同,所以将this赋值给me,用me调用,否则会报如图错误。

这样问题就解决了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值