小程序开发中如何使用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 源代码显示控件 (Ajax加载方式).
May 18 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
Nov 24 Javascript
jQuery中not()方法用法实例
Jan 06 Javascript
javascript实现捕捉键盘上按下的键
May 05 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
vue 自定义右键样式的实例代码
Nov 06 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 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简单统计中文个数的方法
2016/09/30 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
python正则分组的应用
2013/11/10 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
python 循环数据赋值实例
2019/12/02 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
大学生入党思想汇报
2014/01/01 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
车贷收入证明范本
2014/09/14 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
经营目标责任书
2015/05/08 职场文书
党支部审查意见
2015/06/02 职场文书
办公室管理规章制度
2015/08/04 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python