我大体先描述下,下面代码的意思,和我要干的事。
在购物车页面(前一个页面),用户选中商品后,发给结算页面,参数做成json发过来,但是wx对json参数长度有限制,会被截断。所以json中只含有用户选中的商品id goods_id 和数量count。结算页面拿到json后在 init_goods函数中循环调用服务器api拿到商品信息,逐个把商品的详细信息放到this.data.res中保存,最后在onLoad函数中渲染wxml。可是我发现,在request中所做的保存,在渲染的时候this.data.res还是空的,在request.success函数中this.data.res有值,出了request.success函数后,res数组是空的。
另外,我还发现,在success回调函数中对外部传入的对象所做的修改,退出success函数后也都没有保存到对象中。
初步考虑,1因为request异步执行,拿不到数据
2在调用request的时候,传入的obj是一个副本,所以所做的修改没有反映到原来的地址。
本人经验和知识已不足以解决,大神们,如果知道我的错误,请不吝指个方向
代码如下:
// pages/settlement/settlement.js var qcloud = require( '../../vendor/wafer2-client-sdk/index' ) var config = require( '../../config' ) var util = require( '../../utils/util.js' ) Page({ data: { order_info: {}, res: [] }, init_goods: function (options) { this .data.order_info = JSON.parse(options.order_info) let that = this for ( var i in this .data.order_info.goods_list) { console.log( "i" ,i) goods_id = this .data.order_info.goods_list[i].goods_id qcloud.request({ url: `${config.service.host}/weapp/Goods/get_goods_info/` + goods_id, success(result) { that.data.res.push(result.data) //把结果放到res中保存 }, fail(error) { util.showModel( '请求失败' , error); console.log( 'request fail' , error); } }) // util.requestPromise(`${config.service.host}/weapp/Goods/get_goods_info/` + goods_id) // .then(res => {//用了promise貌似也不行 // console.log("request",res.data) // callback // }) } }, onLoad: function (options) { // this.init_goods(options,()=>{ //回调也不行 // // console.log("callback",this.data.res) // this.setData({ goods_list: this.data.res }) // }) this .init_goods(options) console.log( "in_onload this.data.res :" , this .data.res) //控制台打印的 this .data.order_info.goods_list[0] = this .data.res[0] //这里的this.data.res是空的 this .setData({ goods_list: this .data.res }) //这里的this.data.res是空的 }, }) |
你把onLoad里面最后两行代码放到request的success里看看
在success中setData没有问题,但是只能渲染一个,我需要的是把所有值都获取到后,再渲染整个列表。其实还可以把所有goodsid做成数组发给后端,查询好了,一次性发给前端渲染。今儿个我就是有点轴,不给他破了,实在难受。
其实就是上面request还没执行完,onLoad里就已经开始执行下面的代码了,所以值是空的,所以这种情况需要异步
谢谢,我先去补下异步的知识