小程序开发中如何使用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 相关文章推荐
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
jQuery实用基础超详细介绍
Apr 11 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
Aug 21 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
Node.js之readline模块的使用详解
Mar 25 Javascript
echarts多条折线图动态分层的实现方法
May 24 Javascript
JS中==、===你分清楚了吗
Mar 04 Javascript
实例分析javascript中的异步
Jun 02 Javascript
JS制作简易计算器的实例代码
Jul 04 Javascript
vue+node 实现视频在线播放的实例代码
Oct 19 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
May 06 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查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP模块memcached使用指南
2014/12/08 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
vue实现计算器功能
2020/02/22 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
爽歪歪广告词
2014/03/20 职场文书
民生工程实施方案
2014/03/22 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
党的作风建设心得体会
2014/10/22 职场文书
党员读书活动心得体会
2016/01/14 职场文书