小程序开发中如何使用async-await并封装公共异步请求的方法


Posted in Javascript onJanuary 20, 2019

前言

在平常的项目开发中肯定会遇到同步异步执行的问题,还有的就是当执行某一个操作依赖上一个执行所返回的结果,那么这个时候你会如何解决这个问题呢;

1.是用settimeout让它异步执行,显然这只是让它加入异步任务队列中去执行,但并不能保证等待其返回结果再去执行另一个操作。

2.还是自己封装callback函数?那样就会陷入所谓的回调地狱,代码层层嵌套,环环相扣,逻辑稍微复杂就会很难去维护。

3.当然es6中的promise倒是很好的解决了这样的问题,再配合es7的async和await就更完美了,await返回的也是一个promise对象,这个关于promise和async,await的使用方法就不说了。

实现方案

首先小程序目前还是不支持es7的async和await的,那么如何让它支持呢

1、点击下载

regenerator,并把下载好的runtime.js文件夹放到自己小程序的utils目录下,包总共才20kb多,体积很小的。

小程序开发中如何使用async-await并封装公共异步请求的方法

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官网,输入相关代码可以看下最终转换后的代码。

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

Javascript 相关文章推荐
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
按钮JS复制文本框和表格的代码
Apr 01 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
js判断元素是否隐藏的方法
Jun 09 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
Apr 05 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 Javascript
微信小程序云开发之数据库操作
May 18 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 #Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 #Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 #Javascript
JavaScript中concat复制数组方法浅析
Jan 20 #Javascript
JavaScript中import用法总结
Jan 20 #Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 #Javascript
js序列化和反序列化的使用讲解
Jan 19 #Javascript
You might like
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Apache如何部署django项目
2017/05/21 Python
python matlibplot绘制3D图形
2018/07/02 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python sorted方法和列表使用解析
2019/11/18 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
化学相关工作求职信
2013/10/02 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
银行职员自我鉴定
2014/04/20 职场文书
向女朋友道歉的话
2015/01/20 职场文书
行政申诉状范文
2015/05/20 职场文书
初三语文教学反思
2016/03/03 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技