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

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

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

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

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

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的用法为:

const promist = new Promise(function(resolve,reject){
if(/*异步操作成功*/){
        resolve(value);
    }else{
        reject(error);
    }
})

改造后代码:

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来解决这种异步操作

目录
相关文章
|
2天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的网络游戏交易平台信息管理系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的网络游戏交易平台信息管理系统附带文章和源代码设计说明文档ppt
7 1
|
10天前
|
JavaScript 小程序 Java
基于微信小程序的网络安全科普系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的网络安全科普系统的设计与实现(源码+lw+部署文档+讲解等)
|
18天前
|
小程序 前端开发 JavaScript
微信小程序——解决异步问题
微信小程序——解决异步问题
42 0
|
18天前
|
移动开发 安全 小程序
mpaas常见问题之小程序容器,跑起来后一直提示 "网络不给力, 请稍后再试"如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
|
18天前
|
小程序 前端开发 程序员
【微信小程序】-- 网络数据请求(十九)
【微信小程序】-- 网络数据请求(十九)
|
8月前
|
小程序 API
【 uniapp - 黑马优购 | 首页】小程序首页全局配置(home、网络请求、轮播图、分类...)
【 uniapp - 黑马优购 | 首页】小程序首页全局配置(home、网络请求、轮播图、分类...)
95 0
|
10月前
|
存储 小程序 前端开发
小程序封装网络请求和拦截器
在开发小程序时,实际上我们通常需要封装网络请求和拦截器,以实现统一处理状态码和存储用户登录信息等功能。这样可以提高开发效率,减少代码重复,同时也可以提高代码的可维护性和可读性。
155 0
|
8月前
|
小程序 安全 JavaScript
微信小程序-网络请求
微信小程序-网络请求
132 0
|
9月前
|
小程序 网络安全
当后台架设好了域名正常,但是小程序真机调试出现网络异常,模拟确实正常可以使用
当后台架设好了域名正常,但是小程序真机调试出现网络异常,模拟确实正常可以使用
106 0
|
10月前
|
小程序 前端开发 JavaScript
小程序request请求回调函数异步的解决办法
小程序request请求回调函数异步的解决办法
210 0