异步环境下获取 openid的几个方法
发布于 4 年前 作者 lei70 2954 次浏览 来自 分享

测试几段代码,在异步环境获取 openid ,以交流探讨。

  1. 小程序启动时获取

在 Page 的 onLoad 阶段调用以下函数。该函数通过调用云函数获取openid。当拿到后即设置一个变量 dataReady。该变量用来控制 wxml 页面显示,当为真时即完整显示页面。这里假定:页面完整显示后再使用openid。

// index.js
Page({
    data: {
        openid : "", 
        dataReady: false,
    },
    onLoad: function(){
         getopenid(this)
         //...
    },
})

function getopenid(that){
         wx.cloud.callFunction({
            name: getopenid,
            success: res=>{
               that.setData({openid: res.openid, dataReady: true})
            }
         })
}
// index.xmls
//
// <block wx:if="{{dataReady}}">
//    <view>
//    </view>
// </block>
//

在 函数getopenid中,除了采用回调函数方式,亦可用 Promise 对象(ES6),或 async/await型函数(ES8)等方式。

  1. 在其他场合获取

这时要确保使用openid的代码应出现在获取操作完成后。比如使用回调函数方式:

function getopenid(){
         wx.cloud.callFunction({
            name: getopenid,
            success: res=>{
               //在这里使用openid
            }
         })
}

如果使用 ES6 中的 Promise 对象,就要出现在then语句块里:

var p1 = new Promise(function (resolve, reject) { 
         wx.cloud.callFunction({
            name: "getopenid",
            data: {para1: "", para2: ""}, 
            success: res=>{resolve(res)},
         })
p1.then(res => {
    // 在这里使用 openid 
    }, function(res){}
)

如果使用 ES8 中的async 型函数 ,则应该出现在 await 指令之后。

async getopenid function(){
      lcid = await wx.cloud.callFunction()
      //在这里使用openid 
}

以下列出异步环境下的代码执行顺序:其中:*step i 表示由系统发起。先前各步迅速执行完后,控制权即交给系统。等到悬挂任务(PendingJob)完成后再由系统发起执行后续代码。

  1. 回调函数方式
// step 1
func1()
// step 4
function func1(){
     // step 2
     var lca = wx.cloud.callFunction({success: res=>{
         // *step 5
        }
     })
     // step 3
}
  1. Promise 对象
// step 1
var p1 = new Promise(function(resolve, reject){
         wx.cloud.callFunction({
            success: res=>{
               // *step 4
               resolve(res)
            }
         }) 
    })
// step 2
p1.then({
    // *step 5
    }, {
    }
)
// step 3
  1. async/await 型函数
// step 1
func1()
// step 3
async function func1(){
      // step 2
      var lca = await wx.clooud.callFunction()
      // *step 4
}

欢迎批评指正。[END]

1 回复
onLoad: function(){
         getopenid()//不是this. getopenid()吗
         //...
    },

不是this. getopenid()吗

 

回到顶部