功能分析:多次回调,用Promise来简化流程
app.js 内添加如下代码
/**
* 获取微信code
* Promise
* 用于后续换取openid等操作
* @resolve {String} code
* @reject {String} 错误提示
*/
getWxCodePromise: function () {
return new Promise((resolve, reject) => {
//init
wx.login({
success: res => {
if (res.code){
resolve(res.code);
}else{
reject('code 获取失败: ' + res.errMsg);
}
},
fail: err => {
reject('code 获取失败: ' + err);
},
});
});
},
/**
* 通过code获取openid
* Promise
* @param {String} code 微信code
* @resolve: {ArrayObject} 返回数组,包含两个参数:openid,token
* @reject: {String} 错误提示
*/
getOpenidPromise: function (code) {
var postData = {
code: code
};
var that = this;
// postData.signature = this.makeSign(postData); // 追加签名,非必要,看后台接口的要求
return new Promise((resolve, reject) => {
wx.request({
url: "https://xxx.com/user/wxLogin",// 这里改成实际api接口网址
data: postData,
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
// console.log(res.data);
//全局变量
if (res.data.status == 1) { // 改成实际接口的成功code
var respData = res.data.data;
console.log('openid=' + respData.openid + ', token=' + respData.token);
var userInfo = { "openid": respData.openid, "token": respData.token};
resolve(userInfo)
} else {
console.log('openid 获取失败' + respData.info);
reject('openid 获取失败' + respData.info);
}
},
fail: function (err) {
console.log('openid 获取失败: ' + err);
reject('openid 获取失败: ' + err);
}
})
});
},
/**
* 更新缓存用户uid,openid
* @param {ArrayObject} userInfo
* userInfo.openid {String} 小程序用户的openid,可以为空字符串(空字符串表示清空缓存)
* userInfo.token {String} 用户令牌,可以为空字符串(空字符串表示清空缓存)
*/
updateUserCatch: function (userInfo) {
//本地存储
try {
wx.setStorageSync('token', userInfo.token);
wx.setStorageSync('openid', userInfo.openid);
console.log(userInfo);
console.log('user catch update success');
} catch (e) {
console.log('user catch update fail: ' + e.errMsg);
}
},
调用方法,在需要的界面链式调用,比如Home.js内
//pages/shop/home.js
//获取应用实例
const app = getApp();
Page({
data:{},
onLoad: function(){
},
// ... other code
//这里通过code,换取token及openid,并且存在localStorage里
test: function () {
app.getWxCodePromise().then( // getWxCodePromise 的成功返回值code作为参数传给getOpenidPromise
app.getOpenidPromise
).then( // getOpenidPromise 的成功返回值userInfo作为参数传给updateUserCatch
app.updateUserCatch
).catch( // 捕获并打印错误信息
function(err){
console.log('test() fail: ' + err);
}
);
},
})