码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • umi-request & useRequest 源码分析及业务实践


    导读

    文章通过业务点分析以及深入umi-request,useResut的源码,来探索 umi-request 赋能小程序请求,以及 useRequest 赋能后台业务.

    1. 业务梳理

    1.1 常见问题

    1.page目录、service目录、model目录、typescript目录,utils 目录,所有不同类型的业务逻辑都被拆分在不同的目录内,且还存在相互引用,以及嵌套层级很深,在开发一个页面的时候难以聚焦。
    2.被频繁引用的模块中 if else 使用很多,且存在嵌套,如果需要加入新的逻辑,由于逻辑不清晰,在引入新功能时容易影响老的逻辑,由于被各个页面频繁引用,波及范围较大,容易出现线上问题。
    3.在涉及到后台的定义接口以及使用的过程中,每增加一个接口,都会涉及到对应接口的 loading状态,data状态,error状态,请求前,请求后的处理,当一个业务点涉及的异步逻辑很多的时候,整个业务逻辑会变得很臃肿。

    1.2 解决方案

    1.每一个 page 的不同类型的业务逻辑都放在一个目录内
    2.引入umi-request 来包装 uni-request
    3.引入 useRequest hook,在定义接口文件的时候,同时预实例化对应 service 的hook,便于开发。
    4.将具体页面的状态管理交给 hook,全局的状态交给 model。

    2. 将 umi-request整合进小程序,告别 if else

    基于uni-app 的 uni.request ,非 promise,只有 onSuccess,onFail 回调,小程序不支持urlSearchParams, 手动替换 coreMiddleware

    2.1 小程序请求的一般逻辑流程图

    以下代码均为伪代码,描述整体的脉络。

    function request(url: string, options) {const { noErrToast = false, noLoginToken = false } = options;const params = cloneDeep(data);if (needLoginToken) {if (token) setToken();else return noLoginCallback();}// 删除无效入参removeNillParams(params);return new Promise(function (resolve, reject) {uni.request({url,...options,success(res) {printSucessResponse(res);if (res.code === ErrorCodeA) return specificCodeErrorCallback(res);if (res.code === ErrorCodeB) return specificCodeErrorCallback(res);if (res.code === ErrorCodeC) return specificCodeErrorCallback(res);if (res.code === LOGIN_EXPIRED)return specificCodeErrorCallback(res);if (options.simpleResponse) {if (res.code === SuccessCode) resolve(simplify(res));else {if (options.autoErrToast) return specificCodeErrorCallback(res);reject(res);}} else {resolve(res);}},fail(err) {printFailResponse(err);if (err.errMsg?.startsWith(ErrorMessageA))return specificCodeErrorCallback(err);if (err.errMsg.startsWith(ErrorMessageB))return specificCodeErrorCallback(err);return specificCodeErrorCallback(err);},complete(res) {console.log("request complete =>", url, res);},});});
    } 
    
    • 1
    • 2

    2.2 umi-request

  • 相关阅读:
    C++ STL标准模板库(一)
    整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天数、时间戳等,以及常用的日期时间处理方法
    GienTech动态|入选软件和信息技术服务名牌企业;荣获城市数字化转型优秀案例;参加第四届深圳国际人工智能展
    0基础学习VR全景平台篇第109篇:认识拼接软件PTGui Pro
    软件测试需不需要懂代码?
    C++界面开发框架Qt新手入门指南 - 如何创建Qt Quick UI项目
    vue获取当前页面地址
    javascript 基本语法(二)
    详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量
    【基于pyAudioKits的Python音频信号处理(三)】乐音和噪音
  • 原文地址:https://blog.csdn.net/qq_53225741/article/details/126404180
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号