我正在参与掘金会员专属活动-源码共读第一期,点击参与
前言
延迟函数,可能有的人听过,有的人没听过。在没看到这个东西之前,我也是不知道 delay 延迟函数的,因此出于好奇心,便看了看若川大佬的这一篇文章 面试官:请手写一个带取消功能的延迟函数,axios 取消功能的原理是什么
delay
在上面那篇文章里,若川大佬带我们学会如何实现一个比较完善的 delay 函数,使用 AbortController 实现取消功能以及面试中常考的 axios 取消功能实现。看完文章后,确实学到了很多,这次就 delay 函数的学习来记录一些相关笔记。
源码部分
我们先来看看关于它的源码部分。它的源码部分其实不算很多,七十多行。我们取一些比较关键的代码部分进行分析。
函数内部定义了一个 createDelay 函数,传入的参数有很多种,比如 defaultClear,set,willResolve 等等。
然后我在 createDelay 函数内注意到这样一个函数,如下所示:
这个函数是一个 Promise 函数,通过参数 willResolve 来决定成功还是失败。在上面提及的文章中有使用过。
不难发现,这里面的每个函数都不是多余的,串联性都非常强。
手写实现一个 delay 函数
简单地过了一遍 delay 函数的源码,我们现在来实现一下延迟函数吧。有一种比较简单的实现方法,使用 Promise,并结合上面所介绍到的参数 willResolve,大致代码如下所示:
const delay = (ms, {value, willResolve} = {}) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(willResolve){
resolve(value);
}
else{
reject(value);
}
}, ms);
});
}
现在我们来结合例子使用一下这个函数吧。我创建了一个 react 项目。
测试代码如下:
(async() => {
try{
const result = await delay(1000, { value: '阅读源码', willResolve: true });
console.log(result,'//////');
}
catch(err){
console.log('输出错误结果', err);
}
})();
如果成功则打印出结果 value以及//////,如果失败则输出错误结果。
在这里首先我们将参数 willResolve 写死为 true,打印结果如下:
然后我们将参数 willResolve 写死为 false,打印结果如下:
根据结果不同,也印证了前面提及到的通过参数 willResolve 来决定成功还是失败这一说法,因此在延迟函数里加入这个参数也是有必要的。
总结
通过学习它的源码以及若川大佬的文章,也简单地实现并理解了 delay 延迟函数。关于这个函数的实现以及使用方法,经过简单的学习后,我觉得是挺容易上手的。总之,这次的源码学习整体而言挺轻松的。