欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

小程序开发中如何使用async-await并封装公共异步请求的方法

程序员文章站 2023-11-20 19:07:40
前言 在平常的项目开发中肯定会遇到同步异步执行的问题,还有的就是当执行某一个操作依赖上一个执行所返回的结果,那么这个时候你会如何解决这个问题呢; 1.是用setti...

前言

在平常的项目开发中肯定会遇到同步异步执行的问题,还有的就是当执行某一个操作依赖上一个执行所返回的结果,那么这个时候你会如何解决这个问题呢;

1.是用settimeout让它异步执行,显然这只是让它加入异步任务队列中去执行,但并不能保证等待其返回结果再去执行另一个操作。

2.还是自己封装callback函数?那样就会陷入所谓的回调地狱,代码层层嵌套,环环相扣,逻辑稍微复杂就会很难去维护。

3.当然es6中的promise倒是很好的解决了这样的问题,再配合es7的async和await就更完美了,await返回的也是一个promise对象,这个关于promise和async,await的使用方法就不说了。

实现方案

首先小程序目前还是不支持es7的async和await的,那么如何让它支持呢

1、点击下载

,并把下载好的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官网,输入相关代码可以看下最终转换后的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。