wafer qcloud.request 不能把获取的结果保存到data中
发布于 4 年前 作者 jun62 3192 次浏览 来自 问答

我大体先描述下,下面代码的意思,和我要干的事。

在购物车页面(前一个页面),用户选中商品后,发给结算页面,参数做成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.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是空的
 
    },
})
1 回复

你把onLoad里面最后两行代码放到request的success里看看

回到顶部