菜鳥初識Promise,為了解決小程序得的登陸問題,我采用了Promise去保證用戶先行登陸,再執(zhí)行后面的接口操作。最近卻出現(xiàn)了問題,之前我都是想都沒想 new Promise,今天發(fā)現(xiàn)一個問題,then()
調用的函數(shù)getClub()中的wx.request發(fā)送竟早于最早的Promise對象userlogin()中的wx.request請求發(fā)送。
調用代碼如下
var that = this;
app.userlogin()
.then(
that.getClub()
)
.then(that.changeclub())
.catch(
(err)=>{
console.log(err)
}
)
:
userlogin: function () {
var that = this;
return new Promise(
(resolve,reject) => {
console.log('app.js 登陸函數(shù) 開始運行')
wx.showLoading({
title: '登陸中',
})
wx.login({
success: function (res) {
var code = res.code
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo;
console.log(that.globalData.userInfo)
wx.request({
url: that.login_url,
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
code: code,
nickname: res.userInfo.nickName,
gender: res.userInfo.gender,
city: res.userInfo.city,
province: res.userInfo.province,
country: res.userInfo.country,
head: res.userInfo.avatarUrl,
},
method: 'POST',
success(res) {
that.thirdid = res.data.data
wx.setStorageSync('thirdid', res.data.data)
wx.setStorageSync('userInfo', that.globalData.userInfo)
return resolve('app.js login success')
}
})
},
fail: function () {
wx.showToast({
title: '登陸異常',
image: '/image/erro.png'
})
reject('app.js login failed')
}
})
},
fail: function () {
wx.showToast({
title: '登陸異常',
image: '/image/erro.png'
})
reject('app.js login failed')
},
})
}
)
}
getClub:function(){
console.log('getClub 開始運行');
let thirdid = wx.getStorageSync('thirdid');
let that = this;
wx.request({
url: app.manage_club,
data:{
thirdid:thirdid
},
success(res){
if(res.data.code==200){
that.setData({
club_list:res.data.data
})
console.log('獲取社團列表成功')
return
}
else{
return
}
}
})
}
這里getClub的請求發(fā)送會早于userlogin()的請求,導致getClub中thirdid undefined。
是不是Promise中的異步請求也必須封裝成Promise對象,也就是我必須封裝wx.request方法?還是這里代碼有問題?
有勞各位大佬指教了,感謝感謝。
樓上說的是對的,已 +1。
另外,如果你想保證每一步都是順序執(zhí)行的,則需要在 .then(function)
里面的函數(shù)也返回一個 Promise 對象。比如:
app.userlogin()
.then(() => {
that.getClub()
})
.then(() => {
that.changeclub()
});
這樣的寫法,實際上 this.getClub()
和 this.changeClub()
是同時執(zhí)行的(存在執(zhí)行先后,但不存在異步,可以認為是同時執(zhí)行)。必須這樣(假設他倆都返回一個 Promise 實例):
app.userlogin()
.then(() => {
return that.getClub()
})
.then(() => {
return that.changeclub()
});
它們才會順序執(zhí)行,即前面一個執(zhí)行完才會執(zhí)行后面一個。
順帶廣告一下我的講堂:Promise 的 N 種用法。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。