微信小程序怎么使用Promise对wx.request()封装

其他教程   发布日期:2023年08月21日   浏览次数:709

本文小编为大家详细介绍“微信小程序怎么使用Promise对wx.request()封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么使用Promise对wx.request()封装”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1. 原生wx.request()的缺点

wx.request官网说明

  • 回调地狱,可能会出现多层success套用的情况(用Promise封装解决)

  • 效率低,代码冗杂,每次都要写共同的参数(比如headers,公共的url)

  • 可维护性差,后续查看和改代码不方便,封装后都在同一个文件,一目了然

  1. wx.request({
  2. url: 'example.php', //仅为示例,并非真实的接口地址
  3. data: {
  4. x: '',
  5. y: ''
  6. },
  7. header: {
  8. 'content-type': 'application/json' // 默认值
  9. },
  10. success (res) {
  11. console.log(res.data)
  12. }
  13. })

作为一个合格的前端开发,为了代码质量和可维护性(不是因为懒),肯定要对这种代码进行封装,来让我们的代码变得更优雅~~

2. 封装思路

所有的封装思路(无论是组件还是逻辑代码),总结起来一句话就是抽取共性

观察我们的网络请求代码,可以发现,有很多是一样的,如公共请求路径、对响应错误的处理方法、headers参数(如token)
不同的如具体的接口地址、请求类型、请求参数,我们封装的时候把相同的抽取成一个文件,不同的地方再进行传参即可。

3. 具体实现代码

先建一个api文件夹(叫什么都可以,但是为了规范化),在下面新建文件

  1. request.js
  1. // ----http----
  2. // api URL
  3. const apiUrl = "https://接口地址:端口";// 公共的请求地址
  4. // 封装微信请求方法
  5. const request = (params) => {
  6. let url = params.url;
  7. let data = params.data;
  8. let method = params.method;
  9. let header = {
  10. "Content-Type": "application/json"
  11. };
  12. // 鉴权验证,获取登录之后后端返回的token,存在即在头部Authorization写token,具体的看后端需求
  13. if (wx.getStorageSync("token")) {
  14. // header.Authorization = wx.getStorageSync("token");
  15. header.token = wx.getStorageSync("token");
  16. }
  17. return new Promise((resolve, reject) => {
  18. wx.request({
  19. url: apiUrl + url, // api url
  20. method: method, // get/post
  21. data: data, // 请求参数
  22. header: header, // 头部
  23. success(res) {
  24. // 请求成功
  25. // 判断状态码---errCode状态根据后端定义来判断
  26. if (res.statusCode < 399) {
  27. if (res.data.Code === 401) {
  28. wx.showModal({
  29. title: "提示",
  30. content: "请登录",
  31. showCancel: false,
  32. success(res) {
  33. wx.navigateTo({
  34. url: "/pages/login/login",
  35. });
  36. },
  37. });
  38. reject(res.data);
  39. }
  40. resolve(res.data);
  41. } else {
  42. // 其他异常
  43. switch (res.statusCode) {
  44. case 404:
  45. wx.showToast({
  46. title: '未知异常',
  47. duration: 2000,
  48. })
  49. break;
  50. default:
  51. wx.showToast({
  52. title: '请重试...',
  53. duration: 2000,
  54. })
  55. break;
  56. }
  57. reject("未知错误,请稍后再试");
  58. }
  59. },
  60. fail(err) {
  61. if (err.errMsg.indexOf('request:fail') !== -1) {
  62. wx.showToast({
  63. title: '网络异常',
  64. icon: "error",
  65. duration: 2000
  66. })
  67. } else {
  68. wx.showToast({
  69. title: '未知异常',
  70. duration: 2000
  71. })
  72. }
  73. reject(err);
  74. },
  75. complete() {
  76. wx.hideLoading()
  77. },
  78. });
  79. });
  80. };
  81. module.exports = {
  82. apiUrl,
  83. request,
  84. }

然后再按业务需求,对具体的接口地址进行封装,比如,我这里在api文件夹下再新建一个

  1. user.js
文件,里面放登录,注册的一些方法,请求类型和请求参数根据接口文档写。
  1. import {
  2. request
  3. } from "./request"
  4. // 用户相关
  5. // 登录
  6. export const login = (params) => {
  7. return request({
  8. url: '/user/login',
  9. data: params,
  10. method: 'POST',
  11. })
  12. }
  13. // 注册
  14. export const register = (params) => {
  15. return request({
  16. url: '/user/reg',
  17. data: params,
  18. method: 'POST',
  19. })
  20. }

正式在项目中使用:

  1. import {
  2. login
  3. } from '../../../api/user'
  4. // 点击登录的方法
  5. handleLogin(){
  6. login({
  7. name: xxx,
  8. password: xxx,
  9. }).then((res) => {
  10. if (res.code == 200) {
  11. // 登录成功之后的处理
  12. } else {
  13. // 登录失败的处理
  14. }
  15. }).catch((res) => {})
  16. }

以上就是微信小程序怎么使用Promise对wx.request()封装的详细内容,更多关于微信小程序怎么使用Promise对wx.request()封装的资料请关注九品源码其它相关文章!