高阶函数之断连重试

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~

🚀技术&代码分享

  • 我在 IT200 总结技术学习;
  • 我在 1024Code 在线编写代码;
  • 我在 掘金 分享技术文章;
  • 我在 Github 参与开源学习;

😇推荐几个好用的工具

进入正题

在近场通信中发现断连重视是一个比不可少的功能,其中典型的近场通信就是蓝牙,通常使用的蓝牙设备如蓝牙耳机、蓝牙手表等传输距离大多在10米以内效果最佳,超距离或待机(长时间不工作)后会与中心设备(服务端)断开连接(掉线),作为开发人员就需要在设备掉线后积极发送连接请求,在蓝牙设备再次激活时及时建立连接,恢复通信。

断连重试函数

断连重试函数接收一个可以返回 Promise 对象的函数,内部使用递归的方式实现,并且支持设置重试次数和等待重试时间。

export function reTry(fn, params, times = 3, delay = 3) {
	return new Promise((resolve, reject) => {
		const reTryFn = async (times) => {
			try {
				const res = await fn(params);
				resolve(res)
			} catch (err) {
				if (times > 0) {
					setTimeout(() => {
						console.log('Request failed, retrying ...');
						reTryFn(times - 1)
					}, delay * 1000)
				} else {
					reject(err)
				}
			}
		}
		reTryFn(times)
	})
}

PS:这个函数不支持所谓的无限重试,就比如在蓝牙开发时,你可以通过重试的次数和等待重试的时间来控制等待蓝牙设备的再次激活。按每等待10秒重试一次计算,1分钟重连6次、1小时360次、24小时8640次,那说明这个设备早关机了,洗洗睡吧。

测试用例:

执行下面的测试用例,请求在第一次发送遭到失败后等待 2秒 发起重试,在经历 3次 重试依然失败后返回最终失败的结果;

import axios from "axios";
import {
	reTry
} from "./itReTry.js";

const request = () => {
  console.log('initiate request');
  return axios.get('')
};

reTry(request, {}, 3, 2)
	.catch(err => {
		console.log(err.message);
	});

总结

如果你确实需要一个无限重试的功能,那么我觉得你可以使用 while 循环,如果真的有必要的话,要不我依然认为文中的重试函数更适合你。

PS:完整代码见1024Code


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~

posted @ 2023-03-08 09:49  FE小鑫同学  阅读(8)  评论(0编辑  收藏  举报