当前位置:   article > 正文

如何实现微信小程序API的Promise化_如何把函数 promise 化

如何把函数 promise 化

默认情况下,小程序官方提供的异步 API 都是基于回调函数实现的,例如,网络请求的 API 需要按照如下的方式调用

  1. wx.request({
  2. url: '',
  3. method: '',
  4. data: {},
  5. success: (res) => {
  6. console.log(res);
  7. },
  8. fail: (res) => {
  9. console.log(res);
  10. },
  11. complete: (res) => {
  12. console.log(res);
  13. }
  14. })

这种代码的缺点是显而易见的, 容易造成回调地狱的问题,代码的可读性、维护性差。而我们就想将这种类型的代码使用 `API Promise` 化进行改造,从而提高代码的可读性、维护性,避免回调地狱的问题。

1.手动实现wx.request的Promise化 

  1. //Promise化
  2. requestPromise(url, method) {
  3. return new Promise((resolve, reject) => {
  4. wx.request({
  5. url,
  6. method,
  7. success: (res) => {
  8. resolve(res)
  9. },
  10. fail: (res) => {
  11. reject(res)
  12. }
  13. })
  14. })
  15. },
  16. //调用----方法一
  17. getRequest() {
  18. this.requestPromise('https://www.escook.cn/categories', 'GET').then(res=>console.log(res),err=>console.log(err))
  19. }
  20. //调用----方法二
  21. getRequest() {
  22. this.requestPromise('https://www.escook.cn/categories', 'GET').then(res=>console.log(res)).catch(err=>console.log(err))
  23. }
  24. //调用----方法三
  25. async getRequest() {
  26. try{
  27. const res = await this.requestPromise('https://www.escook.cn/categories', 'GET')
  28. console.log(res);
  29. }catch(err){
  30. console.log(err);
  31. }
  32. },

2.使用 @escook/request-miniprogram 第三方包实现wx.request的Promise化 

npm install @escook/request-miniprogram

 在项目的入口文件中,通过如下的方式进行配置: 

  1. import { $http } from '@escook/request-miniprogram'
  2. // 配置请求根路径
  3. $http.baseUrl = '项目请求根路径...'
  4. // 请求开始之前
  5. $http.beforeRequest = function (options) {
  6. uni.showLoading({
  7. title: '数据加载中...',
  8. })
  9. }
  10. // 请求完成之后
  11. $http.afterRequest = function () {
  12. uni.hideLoading()
  13. }
  14. // 在 uni-app 项目中,将 $http 挂载到uni全局对象上,方便全局调用
  15. uni.$http = $http
  16. // 在小程序中,将 $http 挂载到 wx 顶级对象之上,方便全局调用
  17. wx.$http = $http

 

  1. //使用
  2. async getSwiperList() {
  3. // 3.1 发起请求
  4. const { data: res } = await uni.$http.get('/home/swiperdata')
  5. // 3.2 请求失败
  6. if (res.meta.status !== 200) {
  7. return uni.showToast({
  8. title: '数据请求失败!',
  9. duration: 1500,
  10. icon: 'none',
  11. })
  12. }
  13. // 3.3 请求成功,为 data 中的数据赋值
  14. this.swiperList = res.message
  15. },
  16. },

 3.使用腾讯官方出的第三方库实现小程序所有API 的 Promise 化

npm i --save miniprogram-api-promise

 下载完成,我们不能直接使用这个包,而是需要再次重新构建npm包(建议在构建前先删除原有的 miniprogram_npm,然后再点击工具,构建 npm;如果删除了 miniprogram_npm 目录,构建还是失败,需要把 node_modules、miniprogram_npm 删除以后,重新安装包,重新安装以后,再次进行构建 )
三个步骤实现

  1. //1.在小程序入口文件中调用一次 promisifyAll()方法
  2. import { promisifyAll } from 'miniprogram-api-promise'
  3. //2.声明一个常量,为一个空对象
  4. const wxp = wx.p = {}
  5. //3.调用 promisifyAll()方法
  6. promisifyAll(wx, wxp)

 

  • 我们在 wx 全局对象上定义一个属性 p 让他和 wxp 指向同一个空对象

  • promisifyAll : 做的事就是将 wx 拥有的属性方法都 copy 并改造了一份给了 wxp 这个对象

  • 这样wxp和wx.p就都指向了同一个对象

  1. //使用
  2. async getInfo () {
  3. const { data: res } = await wx.p.request({
  4. url: 'https://www.escook.cn/api/get',
  5. method: 'GET',
  6. data: {
  7. name: 'zs',
  8. age: 19
  9. }
  10. })
  11. // res 处理
  12. console.log(res)
  13. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/677693
推荐阅读
相关标签
  

闽ICP备14008679号