• uni-app:实现request请求的递归(设置request请求的访问次数),并且调用自定义方法给出返回值


    一、效果展示

    失败效果

    成功效果

    二、写入后端请求部分

    分析

    ①自定义一个模块common.js主要用于封装所有的请求函数

    ②核心代码
    1. function requestWithRetry(cmd, username, password, retryCount) {
    2. return new Promise((resolve, reject) => {
    3. uni.request({
    4. url: ip + 'sys/user/login',
    5. data: {
    6. cmd: cmd,
    7. usrname: username,
    8. passwd: password
    9. },
    10. method: 'POST',
    11. dataType: 'json',
    12. header: {
    13. "content-type": "application/json"
    14. },
    15. success: res => {
    16. // 存入全局变量中
    17. getApp().globalData.username = username;
    18. getApp().globalData.password = password;
    19. getApp().globalData.access_token = res.data.access_token;
    20. getApp().globalData.loginmode = loginmode;
    21. console.log(`第 ${retryCount} 次请求成功:`, res.data);
    22. resolve(res.data);
    23. },
    24. fail(err) {
    25. console.error(`第 ${retryCount} 次请求失败,剩余重试次数 ${retryCount - 1}:`, err)
    26. if (retryCount <= 1) {
    27. // 重试次数已经用完,将错误信息返回给调用者
    28. reject(new Error('请求失败'))
    29. } else {
    30. // 还有重试次数,继续重试
    31. setTimeout(() => {
    32. requestWithRetry(cmd, username, password,
    33. retryCount - 1).then(resolve).catch(reject)
    34. }, 500)
    35. }
    36. }
    37. });
    38. });
    39. }
    40. // 调用方法,retryCount 为重试次数
    41. return requestWithRetry(cmd, username, password, 3)
    42. .then(data => {
    43. // console.log('请求成功', data);
    44. return data;
    45. })
    46. .catch(error => {
    47. // console.log('请求失败', error);
    48. throw error;
    49. });


    完整代码

    1. //定义全局变量
    2. const ip = 'XXXX';
    3. //定义全局函数
    4. //生成随机三位数
    5. function generateRandomNumber() {
    6. var min = 100;
    7. var max = 999;
    8. var randomNumber = Math.floor(Math.random() * (max - min + 1) + min);
    9. return randomNumber;
    10. }
    11. //http方式进行登录
    12. function login_httpmode(username, password, cmd, loginmode) {
    13. //http
    14. if (loginmode == 'http') {
    15. function requestWithRetry(cmd, username, password, retryCount) {
    16. return new Promise((resolve, reject) => {
    17. uni.request({
    18. url: ip + 'sys/user/login',
    19. data: {
    20. cmd: cmd,
    21. usrname: username,
    22. passwd: password
    23. },
    24. method: 'POST',
    25. dataType: 'json',
    26. header: {
    27. "content-type": "application/json"
    28. },
    29. success: res => {
    30. // 存入全局变量中
    31. getApp().globalData.username = username;
    32. getApp().globalData.password = password;
    33. getApp().globalData.access_token = res.data.access_token;
    34. getApp().globalData.loginmode = loginmode;
    35. console.log(`第 ${retryCount} 次请求成功:`, res.data);
    36. resolve(res.data);
    37. },
    38. fail(err) {
    39. console.error(`第 ${retryCount} 次请求失败,剩余重试次数 ${retryCount - 1}:`, err)
    40. if (retryCount <= 1) {
    41. // 重试次数已经用完,将错误信息返回给调用者
    42. reject(new Error('请求失败'))
    43. } else {
    44. // 还有重试次数,继续重试
    45. setTimeout(() => {
    46. requestWithRetry(cmd, username, password,
    47. retryCount - 1).then(resolve).catch(reject)
    48. }, 500)
    49. }
    50. }
    51. });
    52. });
    53. }
    54. // 调用方法,retryCount 为重试次数,设置最大次数为三次
    55. return requestWithRetry(cmd, username, password, 3)
    56. .then(data => {
    57. // console.log('请求成功', data);
    58. return data;
    59. })
    60. .catch(error => {
    61. // console.log('请求失败', error);
    62. throw error;
    63. });
    64. }
    65. }
    66. //导出
    67. module.exports = {
    68. ip,
    69. generateRandomNumber,
    70. login_httpmode,
    71. }

    三、进行方法的调用

    核心代码

    1. common.login_httpmode(username, password, cmd, type)
    2. .then(info => {
    3. console.log("请求成功",info)
    4. })
    5. .catch(error => {
    6. console.log("请求失败",error)
    7. });

    完整代码

    1. //执行加载中的效果
    2. uni.showLoading({
    3. title: '正在登录...',
    4. mask: true,
    5. });
    6. //调用登录方法
    7. common.login_httpmode(username, password, cmd, type)
    8. //成功返回
    9. .then(info => {
    10. console.log("请求成功",info)
    11. if (info.success == true) {
    12. uni.hideLoading(); // 隐藏加载提示
    13. //全局变量中的数据
    14. uni.reLaunch({ //跳转到主页
    15. url: '/pages/mine/mine_index/mine_index'
    16. })
    17. } else {
    18. uni.hideLoading(); // 隐藏加载提示
    19. if (info.msg == 'pass err') {
    20. uni.showToast({
    21. title: '账号密码不正确',
    22. icon: 'none'
    23. })
    24. }
    25. }
    26. })
    27. .catch(error => {
    28. console.log("请求失败",error)
    29. uni.showToast({
    30. title: '登录失败',
    31. icon: 'none'
    32. })
    33. });

  • 相关阅读:
    Java:继承和多态
    C++10 --- 函数指针、相关试题
    zabbix 与 grafana 对接
    强化学习-学习笔记14 | 策略梯度中的 Baseline
    【学习笔记】CF1651F Tower Defense
    【maven下载、安装、配置教程】
    Arcgis pro属性表字段计算生成随机数
    FCN中制作自己的数据集并进行训练
    搭建自己的搜索引擎之一
    hash,ACM集训
  • 原文地址:https://blog.csdn.net/weixin_46001736/article/details/134527043