微信小程序setData问题

微信小程序接口请求数据后,通过函数重新计算值,并且循环赋值给数据,可以打印结果,但是setData无效,渲染不出通过计算赋值的数据,如下图,litpic字段数据不显示

img

其他字段渲染出来了吗,渲染代码呢

回调函数里打印一下看看

this.setData({
      clist: mylist
    }, () => {
      console.log(this.data.clist);
     
    });

【以下回答由 GPT 生成】

首先,问题出在异步操作上,因为异步操作不会阻塞主线程,所以在异步操作完成之前,setData方法已经执行完了,所以页面上无法渲染赋值后的数据。

解决方案如下:

  1. 将异步操作Promise化,确保异步操作全部执行完成后再执行setData方法。具体方法是将mygetDis方法修改为返回一个Promise对象,将计算并赋值的操作放在Promise的resolve中。示例代码如下:
function mygetDis(myloc1, keywords) {
  return new Promise((resolve, reject) => {
    // 计算并赋值操作
    // ...
    // 将计算后的结果作为参数传递给resolve
    resolve(res);
  });
}
  1. 使用Promise.all方法来等待所有异步操作执行完成之后再执行setData方法。示例代码如下:
wx.request({
  url: '114/html',
  data: {
    // 请求参数
  },
  success: (res) => {
    var mylist = res.data.data;
    // 用于保存所有异步操作的Promise对象
    var promises = [];
    for (var i = 0; i < mylist.length; i++) {
      let item = mylist[i];
      // 将异步操作Promise化
      let promise = mygetDis(myloc1, item.keywords)
        .then(res => {
          // 通过函数计算并循环赋值给litpic字段
          item.litpic = res;
        });
      promises.push(promise);
    }
    // 使用Promise.all等待所有异步操作完成
    Promise.all(promises)
      .then(() => {
        this.setData({
          clist: mylist
        });
        console.log(this.data.clist);
      });
  }
});

通过以上优化,可以保证所有异步操作执行完成后再执行setData方法,确保计算赋值后的数据可以在页面上正确渲染出来。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^