资讯专栏INFORMATION COLUMN

记一次小程序开发中如何使用async-await并封装公共异步请求

why_rookie / 2697人阅读

摘要:实现方案首先小程序目前还是不支持的和的,那么如何让它支持呢点击下载,并把下载好的文件夹放到自己小程序的目录下,包总共才多,体积很小的。如果想使用这些新的对象和方法,必须使用,为当前环境提供一个垫片。用于实现浏览器并不支持的原生的代码。

前言

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

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

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

3.当然es6中的promise倒是很好的解决了这样的问题,再配合es7的async和await就更完美了,await返回的也是一个promise对象,这个关于promise和async,await的使用方法就不说了。
实现方案
首先小程序目前还是不支持es7的async和await的,那么如何让它支持呢


1、点击下载 

regenerator,并把下载好的runtime.js文件夹放到自己小程序的utils目录下,包总共才20kb多,体积很小的。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101206.html

相关文章

  • 小程开发技巧总结

    摘要:前言最近公司要开发一款电商小程序,匆忙看了一遍文档就开始干活了。整体开发体验个人感觉不太好,特别是如果之前习惯了开发,突然去开发小程序,感觉很鸡肋。 前言 最近公司要开发一款电商小程序,匆忙看了一遍文档就开始干活了。整体开发体验个人感觉不太好,特别是如果之前习惯了Vue开发,突然去开发小程序,感觉很鸡肋。以下是我在开发中遇到的一些问题以及解决方法的总结,仅供参考 引入iconfont ...

    Wuv1Up 评论0 收藏0
  • 一次mpvue开发完整小程相关笔记

    摘要:再将该参数通过方法进行解码处理,即可得到对应的参数值。通过处理,分享一个可以获取当前所有打开的页面的任一页面的栈信息。 通过一个月的小程序开发,记录下一点点小心得······ 先给各位大佬请安了~~ showImg(https://user-gold-cdn.xitu.io/2019/1/18/1686082a30691cd2?w=300&h=560&f=gif&s=62963); 1...

    kk_miles 评论0 收藏0
  • 美团小程框架mpvue入门教程

    摘要:美团小程序框架入门教程自打写了美团小程序框架蹲坑指南一发不可收拾,今天趁周末空闲,来写个没朋友的简单入门教程,本教程只针对新手,老鸟勿喷。 美团小程序框架mpvue入门教程 自打写了 美团小程序框架mpvue蹲坑指南,一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷。 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋...

    YorkChen 评论0 收藏0
  • 一次基于mpvue的小程开发及上线实战

    摘要:一起打车吧微信小程序依然是一个玩具般的存在,仅供自己学习和探索,当然也欢迎各位读者能够贡献代码,参与开发 小程序名称:一起打车吧 项目地址:客户端:https://github.com/jrainlau/t... 服务端:https://github.com/jrainlau/t... 小程序二维码:showImg(https://segmentfault.com/img/bV80...

    freewolf 评论0 收藏0
  • 一次基于mpvue的小程开发及上线实战

    摘要:一起打车吧微信小程序依然是一个玩具般的存在,仅供自己学习和探索,当然也欢迎各位读者能够贡献代码,参与开发 小程序名称:一起打车吧 项目地址:客户端:https://github.com/jrainlau/t... 服务端:https://github.com/jrainlau/t... 小程序二维码:showImg(https://segmentfault.com/img/bV80...

    miqt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<