收藏
回答

如何解决在onReady中无法获取this.data中的数据?

var util = require('../../utils/util')
Page({
  data: {
    book: {}
  },
  onLoad: async function (options) {
    var { data: res } = await util.http(`/book/${options.id}/detail`, "GET")
    res.summary = res.summary.replace(/\\n/g, "\n");
    console.log(this.data) //  ---第9行
    this.setData({
      book: res,
      id: options.id
    })
  },
  onReady: function () {
    this.getCommentsList()
  },
  getCommentsList: function () {
    console.log(this.data)  //   ---第19行
    console.log(this.data.id) // ----第20行
  }

})

在getCommentsLis函数中,第二行打印一直都是undefined,但是第一行却能获取到数据
实在想不懂,为啥会这样,请各位大哥帮忙看一下,谢谢!!

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

3 个回答

  • Admin²⁰²⁰
    Admin²⁰²⁰
    04-29
    异步的原因,onLoad还没执行完就onReady去请求读取值了。
    你改这样试试:
    
    var util  = require('../../utils/util')
    Page({
      data: {
        book: {}
      },
      onLoad: async function (options) {
        
      },
      onReady: function () {
      var { data: res } = await util.http(`/book/${options.id}/detail`, "GET")
        res.summary = res.summary.replace(/\\n/g, "\n");
        console.log(this.data) //  ---第9行
        this.setData({
          book: res,
          id: options.id
        },()=>{
        this.getCommentsList()
      })
      },
      getCommentsList: function () {
        console.log(this.data)  //   ---第19行
        console.log(this.data.id) // ----第20行
      }
    
    })
    
    04-29
    有用 2
    回复
  • 胖丫么胖
    胖丫么胖
    04-29
    大哥 同步异步了解下???你前面是请求接口成功后触发的setData,而在你请求还未成功的时候onReady就已经执行了,相当于你setData还没触发就走了取this.data.id这一步 肯定是undefined啊。。你下面的this.getCommentsList()放到setData后。或者使用promise进行处理
    this.setData({
        id: options.id
    }, () => {
      this.getCommentsList()
    })
    
    
    04-29
    有用 2
    回复 7
    • 小孩🏅
      小孩🏅
      04-29
      大哥您的意思是,因为我把onLoad函数变成了async函数,所以就造成这样的问题?
      04-29
      回复
    • 胖丫么胖
      胖丫么胖
      04-29回复小孩🏅
      不是。。。害。。你这样吧 你把 id的setdata放到请求接口之外。
      04-29
      回复
    • 胖丫么胖
      胖丫么胖
      04-29回复小孩🏅
      04-29
      1
      回复
    • 小孩🏅
      小孩🏅
      04-29
      您的意思我懂,但我有个地方不明白,我的util的http函数,是经过promise包装过得,为啥还会有这个问题呢?
      04-29
      回复
    • 小孩🏅
      小孩🏅
      04-29
      因为我的util.http是返回一个Promise对象,我在onLoad中用async和await不是可以把这个异步变成同步了吗
      04-29
      回复
    查看更多(2)
  • Mixchain 俞哄哄🤳📲
    Mixchain 俞哄哄🤳📲
    04-29

    这是接口异步导致的

    你在onload中增加了同步可以选择将 getCommentsList方法在onload中执行

    若有帮助请帮忙点个"有用"谢谢↓↓

    04-29
    有用 1
    回复 2
    • 小孩🏅
      小孩🏅
      04-29
      您好,我试过这样做,因为我这个页面需要去请求两次接口,如果在onload中把两次请求都执行了,这样页面显示会比较慢,所以我想把两个请求分开来
      04-29
      回复
    • Mixchain 俞哄哄🤳📲
      Mixchain 俞哄哄🤳📲
      04-29回复小孩🏅
      你可以直接在onload开始的地方先赋值
      this.setData({
          id: options.id
      })
      04-29
      1
      回复
登录 后发表内容
问题标签