小程序做ajax 调取后无法返回数据!
一直为空,后面发现是异步的问题
wx.request是异步请求,就会
导致,网络请求还没结束,就会执行后面的代码,从而引起异常,怎么解决这种异步导致的问题呢,当然是promise了。看例子:
我们再all.js里面
const app = getApp(); function ajaxlist(typeid,pagesize,name,page){ //传递id 和需要的获取的页 _this=this; var page=page || 1, typeid=typeid, name=name, pagesize=pagesize || 8; swan.request({ url:app.gameUrl + '/plus/list_ajax.php', method: 'GET', dataType: 'json', async:false, // 同步请求 data: { ajax: 'pullload', pagesize: '4', typeid: '3', page: '1' }, header: { 'content-type': 'application/json' // 默认值 }, success: function(res) { console.log(res); var b=res.data.data; /*_this.setData({ b:res.data.data })*/ }, fail: function(err) { console.log(err); console.log('错误码:' + err.errCode); console.log('错误信息:' + err.errMsg); } }); return(b); console.log(b); }
这时候我们发现完全获取不到b的值
解决办法:利用promise
网络请求改成:
const app = getApp(); function ajaxlist(typeid,pagesize,name,page){ return new Promise(function (resolve, reject) { //传递id 和需要的获取的页 _this=this; var page=page || 1, typeid=typeid, name=name, pagesize=pagesize || 8; swan.request({ url:app.gameUrl + '/plus/list_ajax.php', method: 'GET', dataType: 'json', async:false, // 同步请求 data: { ajax: 'pullload', pagesize: '4', typeid: '3', page: '1' }, header: { 'content-type': 'application/json' // 默认值 }, success: function(res) { console.log(res); var result=res.data.data; resolve(result) ; }, fail: function(err) { console.log(err); console.log('错误码:' + err.errCode); console.log('错误信息:' + err.errMsg); } }); }) } module.exports.ajaxlist = ajaxlist;
请求方法改成:
all.ajaxlist(3,3,1).then((res) => { _this.setData({ arr : res }) }).catch((res) => { console.log(res); })
简单记忆:resolve 返回,之后代码走then,reject返回,那么代码就会走catch。 请求方法改成:
我们可以把执行GetUserEntity方法之后要执行的代码放在then中,如果GetUserEntity中发起的请求出错那么程序就会通过reject返回信息,
那么我们可以再catch中做相应的处理。