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

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

ReferenceError: regeneratorRuntime is not defined

需要解决的问题都有哪些:

  1、截止到发文前小程序还不支持ES7的语法,我们到底能不能用?

  2、撸的方式又是怎样的?

实践的方式如下:

第一个问题:

  虽然小程序不支持,但是我们可以引入js库啊。双手奉上 facebook 的开源库 regenerator 下载 'packages/regenerator-runtime' 将这个文件放到自己小程序项目下的 utils 或者 lib 文件夹下。

  总共就23K不要担心包体积的问题。

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

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

第二个问题:

Async 跟 Await 的用法。

  Async - 定义异步函数(async function someName(){...})

  自动把函数转换为 Promise

  当调用异步函数时,函数返回值会被 resolve 处理

  异步函数内部可以使用 await

Await - 暂停异步函数的执行 (var result = await someAsyncCall();)

  当使用在 Promise 前面时,await 等待 Promise 完成,并返回 Promise 的结果

  await 只能和 Promise 一起使用,不能和 callback 一起使用

  await 只能用在 async 函数中

案例代码(一):

在根目录下新建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
}

index.js

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

//app.js
const api = require('./api/index') App({
onLaunch: function () { },
// 全局数据中暴露api
globalData: {
api
}
})

app.js

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

const app = getApp()

const api = app.globalData.api
const regeneratorRuntime = require('../../lib/regenerator-runtime/runtime')
Page({ onLoad() {
this.init()
}, // 初始化
async init() {
console.log("日志打印(1)");
await api.showLoading() // 显示loading console.log("日志打印(2)");
await this.getList() // 请求数据 console.log("日志打印(3)");
await api.hideLoading() // 等待请求数据成功后,隐藏loading console.log("日志打印(4)");
}, // 获取列表
getList() {
return new Promise((resolve, reject) => {
api.getData('http://127.0.0.1:9003/list', {
token: "043c00e6c7ff021e8cc4d394d3264cb5e8c"
}).then((res) => {
this.setData({
list: res
})
console.log("返回数据");
resolve()
})
.catch((err) => {
reject(err)
})
})
}, })

引用的页面

主要看日志的打印顺序 查看执行流程    自行改动 异步|同步 查看效果。

案例代码(二):

// pages/index/index.js

//index.js
import regeneratorRuntime from '../../utils/runtime.js'
const moment = require('../../utils/mp-moment') //获取应用实例
const app = getApp() Page({ /**
* 页面的初始数据
*/
data: { }, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
let that = this
// 同步执行异步函数
that.testAsync()
// 异步执行异步函数
// that.testSync()
},
async testAsync() {
let that = this
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ' testAsync start')
console.log('show loading') let resultOne = await that.getValueOne();
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + resultOne)
let resultTwo = await that.getValueTwo();
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + resultTwo)
console.log('hide loading')
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ' testAsync end')
},
async testSync() {
let that = this
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ' testSync start')
console.log('show loading') let resultOne = that.getValueOne();
let resultTwo = that.getValueTwo(); let results = await Promise.all([resultOne, resultTwo])
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + results[0])
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + results[1]) console.log('hide loading')
console.log(moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ' testSync end') },
getValueOne() {
let that = this
let startTime = Date.now() return new Promise (function(resolve, reject) {
setTimeout(function() {
let endTime = Date.now()
resolve(' 请求成功 one ' + moment(endTime - startTime) + 'ms')
}, 1000)
})
},
getValueTwo() {
let that = this
let startTime = Date.now() return new Promise(function (resolve, reject) {
setTimeout(function () {
let endTime = Date.now()
resolve(' 请求成功 two ' + moment(endTime - startTime) + 'ms')
}, 3000)
})
},
})

WeChat-SmallProgram:微信小程序中使用Async-await方法异步请求变为同步请求的更多相关文章

  1. 微信小程序中的不同场景,不同的判断,请求的时机

    本来5月1之前就想写一下一篇关于小程序不同场景下发送ajax请求的问题,但是放假的前一天,出了个大bug,就是因为我修改不同的场景下执行不同的逻辑造成的 1.首先,在小程序里,微信做了很多的缓存,我们 ...

  2. 全栈开发工程师微信小程序-中(中)

    全栈开发工程师微信小程序-中(中) 开放能力 open-data 用于展示微信开放的数据 type 开放数据类型 open-gid 当 type="groupName" 时生效, ...

  3. 微信小程序中同步 异步的使用

    https://www.jianshu.com/p/e92c7495da76   微信小程序中使用Promise进行异步流程处理 https://www.cnblogs.com/cckui/p/102 ...

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

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

  5. 网页或微信小程序中使元素占满整个屏幕高度

    在项目中经常要用到一个容器元素占满屏幕高度和宽度,然后再在这个容器元素里放置其他元素. 宽度很简单就是width:100% 但是高度呢,我们知道的是height:100%必须是在父元素的高度给定了的情 ...

  6. 在微信小程序中使用富文本转化插件wxParse

    在微信小程序中我们往往需要展示一些丰富的页面内容,包括图片.文本等,基本上要求能够解析常规的HTML最好,由于微信的视图标签和HTML标签不一样,但是也有相对应的关系,因此有人把HTML转换做成了一个 ...

  7. 微信小程序中发送模版消息注意事项

    在微信小程序中发送模版消息 参考微信公众平台Api文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#模版消息管理 此参考地址 ...

  8. 微信小程序中placeholder的样式

    通常,现代浏览器大多支持::placeholder选择器,用于设置placeholder的样式,但是在微信小程序中并不支持这种方式,而是提供了一个专门的属性(placeholder-class)来处理 ...

  9. 微信小程序中转义字符的处理

    在微信小程序开发过程中,有时候会用到常用的一些特殊字符如:‘<’.‘>’.‘&’.‘空格’等,微信小程序同样支持对转义字符的处理,下面提供两种方法用来处理微信小程序中转义字符的处理 ...

随机推荐

  1. VMware安装CentOS6.X 系统

    1.虚拟机中的"CD/DVD(IDE)"配置好Linux映像文件后,打开虚拟机,点击"开启此虚拟机" 2.进入光盘启动界面,选择第一项,表示安装升级Linux系 ...

  2. Java设计模式二

    今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...

  3. 仿segmentfault-table横向滚动

    问题描述 自己的博客在用移动端访问时,如果table的列数足够多会显示不全,如下图红圈所示 正常情况如图 解决过程 使用chrome发现segmentfault的解决方法是在table上套一个tabl ...

  4. jspdf + html2canvas 实现html转pdf (提高分辨率版本)

    刚解决了html中某div块生成pdf的问题,热乎乎的,赶紧记录下 引入的js传送门: https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jsp ...

  5. 华为物联网IoT学习笔记目录

    实验准备: 1.<小熊派功能介绍> 2.<小熊派硬件分析> 3.<STM32Cube软件安装介绍> 4.<MDK软件安装介绍> 5.<华为 IoT ...

  6. Feign 第一个Feign程序 一

    Feign 开源地址:https://github.com/OpenFeign/feign 1.编写接口服务 (1)导入jar包 <parent> <groupId>org.s ...

  7. ant tree 展开key的集合

    这次有个功能 ant的tree 展开 点击子节点 新增节点之后 数据能够照常展开 有几种方法 我能想到的 因为ant 有个expanded 只要设置为true就能展开了,但是这边有个陷阱,就是仅仅设置 ...

  8. asp.net mvc core 管道以及拦截器初了解

    今天来看一下asp.net core的执行管道.先看下官方说明: 从上图可以抛光,asp.net core的执行顺序是,当收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的 ...

  9. 使用vue cli3新建一个vue项目

    写在最前 虽然身为一个java后端工作者,前端还是要沾点的,基于vue的火热,所以平常的工作中项目前端基本都是vue.这次就主要讲一讲vue项目的创建,并从vue的安装开始讲起,附带上我之前安装使用时 ...

  10. Airtest,Poco,Unity自动化测试集成

    作为一个Game Developer,测试部分是必不可少,程序完成需求首先要进行S0相关的测试,这样确保交付到策划验收和QA验收时是没有阻断性的bug或者显而易见代码缺陷.那么如何去做测试用例呢?肯定 ...