收藏
回答

如何在js中通过多个函数多次改变data中的值?

在js里通过一个function中获取当前用户的openid,然后存到page里的data中,在其他fuction里再调用data的值返回就是空,请问什么原因?

Page({
  data: {
    useropenid: '',
    my_order_list: []
  },
getopenid_local() {
    var that = this
    wx.cloud.callFunction({
      name: "getopenid",
    }).then(res => {
      that.setData({
        useropenid: res.result.openid
      })
      console.log("data.useropenid: ", that.data.useropenid)
    }).catch(res => {
      console.log("openid获取失败", res)
    })
get_order_list() {
    var that = this
    that.getopenid_local()
console.log("orderlist里的openid:", that.data.useropenid)
    wx.cloud.callFunction({
      name: "get_invite_list",
      data: {
        cloud_openid: that.data.useropenid
      },
      success(res) {
        that.setData({
          my_order_list: res.data
        })
        console.log("成功获取res的数据:", res, that.data.my_order_list)
      }, fail(res) {
        console.log("获取res的数据失败", res)
      }
    })
  },





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

3 个回答

  • 子不语
    子不语
    2020-05-14

    异步问题,你在使用的时候,还没获取到openid

    请学会如何「提问」(👈戳我)

    2020-05-14
    有用 1
    回复 4
    • jizhao
      jizhao
      2020-05-14
      感谢大神回复,请问这种情况如何解决能获取到openid呢
      2020-05-14
      1
      回复
    • 子不语
      子不语
      2020-05-14回复jizhao
      等拿到openid之后,再去获取
      2020-05-14
      回复
    • jizhao
      jizhao
      2020-05-14回复子不语
      怎么实现等拿到再取呢?
      2020-05-14
      回复
    • 子不语
      子不语
      2020-05-14回复jizhao
      看看楼下老张的解决方案吧
      2020-05-14
      回复
  • 老张
    老张
    2020-05-14

    https://developers.weixin.qq.com/community/develop/article/doc/000a0aed14c3285bea79e67ee56813

    这样就不会有异步问题。

    2020-05-14
    有用
    回复 3
    • XCXer
      XCXer
      2020-05-14
      onLoad: async function(){
              console.log("step 1")
              await wx.cloud.callFunction({success: res=>{console.log("step 2")}})
              console.log("step 3")
      }
      // 经测试,执行顺序是:step1,3,2。我想应该是 step1,2,3。请问是哪里有问题?
      2020-05-14
      回复
    • 老张
      老张
      2020-05-15
      有await,就不要有success;一个是同步,一个是异步;
      2020-05-15
      1
      回复
    • XCXer
      XCXer
      2020-05-15回复老张
      多谢
      2020-05-15
      回复
  • XCXer
    XCXer
    2020-05-14

    是异步问题。可设置一个标志如 dataready = true。要在dataready时才可以访问openid。另:我是把绝大部分变量都放在 js层 ,而不放在data 中。那些要用在 wxml 页面的,则必须放在data中。比如下述代码中的变量 str1,存取方便。

    // index.js
    var str1 = ""
    Page({
           data:{str2: ""}, 
           func1: function(){},
           func2(){},
        })
    
    function myfunc1(){}
    function myfunc2(){}
    
    
    
    2020-05-14
    有用
    回复 3
    • jizhao
      jizhao
      2020-05-14
      具体怎么实现这个标志呢
      2020-05-14
      回复
    • XCXer
      XCXer
      2020-05-14回复jizhao
      我是在 小程序启动阶段就去读取openid的,在未读取到之前不进入交互阶段。如果使用openid的代码正好是在启动完成并已进入交互阶段的话,就这样处理没问题。在 app.js 的 onlauntch 里就去读openid。然后在index.js 的 onload里检查读取是否完成(设置一个定时器去检查)。收到后再开始交互操作,再去使用 openid。如果你要在启动阶段就使用openid,那就放在定时器里。附:定时器的例子:小程序初始化阶段可以用定时器执行不同操作? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0004262ea8ccd022315a3a11051013
      2020-05-14
      回复
    • XCXer
      XCXer
      2020-05-14回复jizhao
      老张大神用的方法:在page 的 onload  阶段,采用 js 的函数async/await 可达到同步的目的,方法简洁实用。(promise:  ECMA-262-6-2015;async/await:  ECMA-262-8-2017)
      2020-05-14
      回复
登录 后发表内容
问题标签