小程序开发中如何使用async-await并封装公共异步请求的方法
前言
在平常的项目开发中肯定会遇到同步异步执行的问题,还有的就是当执行某一个操作依赖上一个执行所返回的结果,那么这个时候你会如何解决这个问题呢;
1.是用settimeout让它异步执行,显然这只是让它加入异步任务队列中去执行,但并不能保证等待其返回结果再去执行另一个操作。
2.还是自己封装callback函数?那样就会陷入所谓的回调地狱,代码层层嵌套,环环相扣,逻辑稍微复杂就会很难去维护。
3.当然es6中的promise倒是很好的解决了这样的问题,再配合es7的async和await就更完美了,await返回的也是一个promise对象,这个关于promise和async,await的使用方法就不说了。
实现方案
首先小程序目前还是不支持es7的async和await的,那么如何让它支持呢
1、点击下载
regenerator,并把下载好的runtime.js文件夹放到自己小程序的utils目录下,包总共才20kb多,体积很小的。
2、在需要调的地方引入 import regeneratorRuntime from '../../utils/runtime.js'
3、如何封装并使用
封装:
const postData = async function(url, data) { wx.showLoading({ title: '加载中', }) let promiseP = await new Promise(function(resolve, reject) { wx.request({ url: baseUrl + url, data: data, method: 'POST', header: { 'content-type': 'application/json', 'access-token': wx.getStorageSync('token') }, success: function(res) { wx.hideLoading(); if (res.statusCode === 200) { resolve(res) } else { reject(res.data) } }, fail: function(err) { wx.hideLoading(); reject(err) if (err.code === 401) {} } }) }) return promiseP } module.exports = { postData }
使用:
import regeneratorRuntime from '../../utils/runtime.js'; const app = getApp(), postData = require('../../service/koalaApi.js'); async demo() { await postData(app.globalData.baseUrl + '/test',{ data: {} }).then((res) => { console.log(res) }) }
下面进行了更完善的一个封装,包括各种错误判断的处理和简化,通过传参的方式,来灵活调用
// 当前host const url_host = require('API.js').host // 当前版本 const currentVersion = require('util.js').currentVersion // 当前路径 import { currentPagePath } from 'util.js' // 调用fetch方法,然后依次链式传入 // url, method, header, data, loading(是否显示loading) function fetch(url, method, header, data, loading) { // 判断给服务端传递undefined的问题 let fetchP = new Promise(function (resolve, reject) { if (loading) { wx.showLoading({ icon: 'loading' }) } if(data && data.unionId && typeof data.unionId === "undefined"){ wx.hideLoading() return reject({ ok:false, error: 'unionId -> ' + typeof data.unionId }); } wx.request({ url: url_host + url, method: method ? method : 'GET', header: { 'content-type': 'application/json', // 默认值 'version': currentVersion, 'pagePath': currentPagePath() }, data: data, success: function (res) { if (res.statusCode < 500) { resolve(res.data) } else { showError() reject(res.data) } }, fail: function (err) { showError() reject(err) }, complete: function (comp) { if (loading) { wx.hideLoading() } } }) }) return fetchP } // 服务器开小差了 function showError () { wx.hideLoading() // 获取头文件路径 wx.navigateTo({ url: '/pages/serverError/serverError', }) } module.exports = { fetch }
思考
1、为什么引入regeneratorRuntime,就能够使用async/await?不需要配合babel吗?
2、regeneratorRuntime都做了什么?
总结
1、首先先明白babel和polyfill分别干啥的;
Babel 是一个广泛使用的转码器,Babel 默认只转换新的 JavaScript 句法,而不转换新的 API。
例如,Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转译。
如果想使用这些新的对象和方法,必须使用 babel-polyfill,为当前环境提供一个垫片。
2、Polyfill用于实现浏览器并不支持的原生API的代码。
3、在明白上面的意思之后,还需要明白的是,babel-polyfill是一股脑把全部都给你添加到js文件中,而现在的runtime将会判断你哪些需要加载的,有选择性的进行加载,并且后者也不会污染全局变量。在这里regeneratorRuntime最终转化成es6的generator来用的。具体的可以自己去下babel官网,输入相关代码可以看下最终转换后的代码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- 【WePY小程序框架实战四】-使用async&await异步请求数据
- .NET Core控制台应用程序如何使用异步(Async)Main方法详解
- 使用async await 封装 axios的方法
- iOS 网络开发NSURLConnection——使用代理方法发送异步请求
- .NET/C# 使用async和await关键字调用异步方法
- C# 异步编程4 async与await 异步程序开发
- 介绍.net 4.5 异步编程核心内容,如何使用Async和Await进行异步编程
- asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 如何在.net4.0中使用.net4.5的async/await实现异步
- 【转】.NET 4.5 使用async和await关键字调用异步方法
- 对于返回void类型的asyc的异步方法,如何修改,能使用await
- android 开发使用图片异步缓存框架关于图片请求路径不变情况下的解决方法
- .NET 4.5 使用async和await关键字调用异步方法
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- 使用async和await将同步方法包装成异步方法
- 如何在微信小程序中使用async/await
- iOS 网络开发NSURLConnection——使用block回调方法发送异步请求
- Android 异步请求类库Async_Http_Client的使用方法
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”