收藏
回答

wafer qcloud.request 不能把获取的结果保存到data中

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.request 工具 6.5.3 2.2.4

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

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




最后一次编辑于  2019-01-02
回答关注问题邀请回答
收藏

1 个回答

  • Young
    Young
    2019-01-02

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

    2019-01-02
    有用
    回复 3
    • 七星诺必达
      七星诺必达
      2019-01-02

      在success中setData没有问题,但是只能渲染一个,我需要的是把所有值都获取到后,再渲染整个列表。其实还可以把所有goodsid做成数组发给后端,查询好了,一次性发给前端渲染。今儿个我就是有点轴,不给他破了,实在难受。

      2019-01-02
      回复
    • Young
      Young
      2019-01-02

      其实就是上面request还没执行完,onLoad里就已经开始执行下面的代码了,所以值是空的,所以这种情况需要异步

      2019-01-02
      回复
    • 七星诺必达
      七星诺必达
      2019-01-02回复Young

      谢谢,我先去补下异步的知识

      2019-01-02
      回复
登录 后发表内容