小程序开发中如何使用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 相关文章推荐
js判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
jquery版轮播图效果和extend扩展
Jul 18 jQuery
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Python3读取zip文件信息的方法
2015/05/22 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
学校安全工作制度
2014/01/19 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
教师节宣传方案
2014/05/23 职场文书
某某同志考察材料
2014/05/28 职场文书
维稳工作情况汇报
2014/10/27 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
文明单位汇报材料
2014/12/24 职场文书
新郎答谢词
2015/01/04 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
学生退学证明
2015/06/23 职场文书
开学典礼校长致辞
2015/07/29 职场文书