小程序开发中如何使用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 相关文章推荐
jQuery find和children方法使用
Jan 31 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
将查询条件的input、select清空
Jan 14 Javascript
javascript修改IMG标签的src问题
Mar 28 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
js过滤HTML标签完整实例
Nov 26 Javascript
基于javascript实现最简单的选项卡切换效果
May 16 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
JavaScript无操作后屏保功能的实现方法
Jul 04 Javascript
详解webpack2+React 实例demo
Sep 11 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
Jun 10 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
写一个用户在线显示的程序
2006/10/09 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php验证是否是md5编码的简单代码
2014/04/01 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
JavaScript函数详解
2015/02/27 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python学习笔记_数据排序方法
2014/05/22 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python 变量类型详解
2018/10/10 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
详解Python中的Lock和Rlock
2021/01/26 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
教师个人自我评价范文
2014/04/13 职场文书
交通事故私了协议书
2014/04/16 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
聘任证明怎么写
2015/03/02 职场文书
请病假条范文
2015/08/17 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
python 模块重载的五种方法
2021/04/24 Python
使用golang编写一个并发工作队列
2021/05/08 Golang
Python图片检索之以图搜图
2021/05/31 Python
python神经网络Xception模型
2022/05/06 Python
nginx之queue的具体使用
2022/06/28 Servers