小程序开发中如何使用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通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
JS中实现replaceAll的方法(实例代码)
Nov 12 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
js封装可使用的构造函数继承用法分析
Jan 28 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
Aug 04 Javascript
超详细的javascript数组方法汇总
Nov 21 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
Feb 25 Javascript
浅谈pc端rem字体设置的问题
Aug 03 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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怎样调用MSSQL的存储过程
2006/10/09 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
react redux入门示例
2018/04/19 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
python中反射用法实例
2015/03/27 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
暑期研修感言
2014/02/17 职场文书
信息总监管理职责范本
2014/03/08 职场文书
实习证明格式范文
2014/10/14 职场文书
大学生团员个人总结
2015/02/14 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
python实现简单的聊天小程序
2021/07/07 Python
springboot用户数据修改的详细实现
2022/04/06 Java/Android