微信小程序中使用Async-await方法异步请求变为同步请求方法


Posted in Javascript onMarch 28, 2019

微信小程序中有些 Api 是异步的,无法直接进行同步处理。例如:wx.request、wx.showToast、wx.showLoading等。如果需要同步处理,可以使用如下方法:

注意:

Async-await方法属于ES7语法,在小程序开发工具中如果勾选es6转es5, 会报错:

ReferenceError: regeneratorRuntime is not defined

避免报错,可以引入 regenerator

在根目录下创建 lib 文件夹,并将 https://github.com/facebook/regenerator/tree/master/packages 里面的 regenerator-runtime 文件夹放进去。

然后在使用async-awiat的页面中引入:

// pages/list/list.js

const regeneratorRuntime = require('../../lib/regenerator-runtime/runtime')

微信小程序中使用Async-await方法异步请求变为同步请求方法

同步处理异步请求

在根目录下新建api文件夹,里面新建index.js

// request get 请求
const getData = (url, param) => {
 return new Promise((resolve, reject) => {
 wx.request({
  url: url,
  method: 'GET',
  data: param,
  success (res) {
  console.log(res)
  resolve(res.data)
  },
  fail (err) {
  console.log(err)
  reject(err)
  }
 })
 })
}

// request post 请求
const postData = (url, param) => {
 return new Promise((resolve, reject) => {
 wx.request({
  url: url,
  method: 'POST',
  data: param,
  success (res) {
  console.log(res)
  resolve(res.data)
  },
  fail (err) {
  console.log(err)
  reject(err)
  }
 })
 })
}

// loading加载提示
const showLoading = () => {
 return new Promise((resolve, reject) => {
 wx.showLoading({
  title: '加载中...',
  mask: true,
  success (res) {
  console.log('显示loading')
  resolve(res)
  },
  fail (err) {
  reject(err)
  }
 })
 })
}

// 关闭loading
const hideLoading = () => {
 return new Promise((resolve) => {
 wx.hideLoading()
 console.log('隐藏loading')
 resolve()
 })
}

module.exports = {
 getData,
 postData,
 showLoading,
 hideLoading
}

在入口文件 app.js 中引入:

//app.js 
const api = require('./api/index')

App({
 onLaunch: function () {
 
 },
 // 全局数据中暴露api
 globalData: { 
 api
 }
})

在需要使用api 的页面中处理如下:

// pages/list/list.js
const app = getApp()

const api = app.globalData.api

Page({
 
 onLoad () {
 this.init()
 },

 // 初始化
 async init () {
 await api.showLoading() // 显示loading
 await this.getList() // 请求数据
 await api.hideLoading() // 等待请求数据成功后,隐藏loading
 },

 // 获取列表
 getList () {
 return new Promise((resolve, reject) => {
  api.getData('http://127.0.0.1:3000/list', {
   x: '',
   y: ''
  }).then((res) => {
  this.setData({
   list: res
  })
  console.log(res)
  resolve()
  })
  .catch((err) => {
   console.error(err)
   reject(err)
  })
 })
 },
 
})

参考:https://3water.com/article/158645.htm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery事件与函数的使用介绍
Sep 29 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
详解JS中的立即执行函数
Feb 24 Javascript
详解VUE中v-bind的基本用法
Jul 13 Javascript
Three.js基础学习之场景对象
Sep 27 Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 Javascript
小程序api实现promise封装过程解析
Nov 21 Javascript
js回调函数仿360开机
Dec 26 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
详解Js里的for…in和for…of的用法
Mar 28 #Javascript
ES7之Async/await的使用详解
Mar 28 #Javascript
详解vue-cli3多环境打包配置
Mar 28 #Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 #Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 #Javascript
详解一个基于套接字实现长连接的express
Mar 28 #Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
Mar 28 #Javascript
You might like
深入探究PHP的多进程编程方法
2015/08/18 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
讲解Python中的标识运算符
2015/05/14 Python
Python数据类型学习笔记
2016/01/13 Python
python自定义异常实例详解
2017/07/11 Python
Python for循环中的陷阱详解
2018/07/13 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
语文教研活动总结
2014/07/02 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
顶岗实习计划书
2015/01/16 职场文书
课题研究阶段性总结
2015/08/13 职场文书
Win2008系统搭建DHCP服务器
2022/06/25 Servers
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript