前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >处理小程序网络请求异步执行的问题

处理小程序网络请求异步执行的问题

作者头像
江咏之
发布2022-06-16 08:57:05
4740
发布2022-06-16 08:57:05
举报
文章被收录于专栏:技术社区

这两天写微信小程序注意到了有些时候会发现使用this.data.list拿到的是空数据,但是明明自己已经请求到了数据了。这就很让人头疼。

原因:因为wx.request是一个异步的请求,所以数据请求的同时,可以继续向下执行函数。所以这里值还没有赋值上就开始打印了变量的值

比如:以下代码在执行的时候 this.updateData()this.updateState()不会分先后,可能先执行前者,可能先执行后者。如果先执行后者的话就先打印list数组了,那么这个时候因为前者是请求数据的,还未执行呢就已经打印list数组了,那么这个时候拿到的肯定是一个空数组。

代码语言:javascript
复制
Page({
  data: {
  list: []
  },
  onload: function() {
    this.updateData();
    this.updateState();
  },
  updateData: function() {   //请求数据
    var that = this
    wx.request({
    url: XXXXX, //你的请求地址
    data: {},
    success: function(res) {
    that.setData({
      list: this.data.data
      }
    }
  })
  },
  updateState: function() {
    var list = this.data.list
    console.log(list)
    //进行数据状态判断
    },
})

这样运行的时候,还没有等到updateData更新到数据,已经在执行updateState了,这样得到的结果往往是不正确的,于是找方法发现了ES6 的promise promise的用法为:

代码语言:javascript
复制
const promist = new Promise(function(resolve,reject){
    if(/*异步操作成功*/){
        resolve(value);
    }else{
        reject(error);
    }
})

改造后代码:

代码语言:javascript
复制
Page({
  data: {
  list: []
  },
  onload: function() {
    var that =this
    new Promise(function(resolve,reject){
        that.updateData(resolve);
    }).then(function(){
        that.updateState();
    })
  },
  //请求数据
  updateData: function(resolve) {
    var that = this
    wx.request({
    url: XXXXX, //你的请求地址
    data: {},
    success: function(res) {
    that.setData({
      list: this.data.data
      if(resolve!=null){
        resolve('ok')
        }
      }
    }
  })
  },
  //拿数据打印
  updateState: function() {
    var list = this.data.data
    console.log(list)
    //进行数据状态判断
    },
})

这样就能保证updateData执行完了之后才执行updateState

还有一个笨方法就是定时器了,先执行请求数据的代码updateData,等过一会再执行打印数据的代码updateState。 当然这种方法是不可取的,最好的办法就是用promise来解决这种异步操作

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因:因为wx.request是一个异步的请求,所以数据请求的同时,可以继续向下执行函数。所以这里值还没有赋值上就开始打印了变量的值
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档