一道编程题
在群里有人发了一道编程题, 起初以为很简单, 尝试写了写, 没做出来.也真是尴尬. 记录下.
最后也没能实现关于异步的处理.
题目概要
- 编写一个函数
var x = function(count, time, func, param){}
; - 该函数有四个参数, 实现的功能为每隔
time
秒执行一次func
函数, 执行count
次 -
param
为传到func
函数里的参数,param
是数组类型,func
函数的形式
解题思路
- 起初以为很简单, 只是简单的考察一些基本的知识点, 事实上, 我大意了.
- 首先是
time
, 一定是一个定时器, 想到了setTimeOut
, - 然后是
count
, 多少个, 也就是一个有多少个定时器, 然后, 经过一定时间就执行一次. - 后面就简单了, 回调函数, 往里面传入一个参数.
- 失败的地方遇到了, 首先是, 如果是定时器的话, 用for循环, 那么时间到了, 刷, 一下子,全都执行了.
- 还有一个点就是关于如何控制次数的, 这个比较容易解决.
- 当时错误的主要地方就是: 关于如何控制定时器的时间, 如果传入不同的时间, 那就是一次分发多个不同的定时器, 如果传入的是同一个时间, 没有找到一个定时器执行完成了, 另一个定时器再执行的方法.
- 其实刚刚自己尝试了很多, 函数立即执行, 闭包, 都没有能实现需求.
答案(一): 一次分发多个定时器
- 这种思路是, 自己在不能控制定时器一个执行完成后, 再执行另外一个时候找到的.
- 当然, 自己刚刚开始, 在传入的时间那里, 有点乱了.
var x = function (count, time, func, param) {
for (let i = 1; i <= count; i++) {
let doTime = parseInt(time) * i * 1000
setTimeout(function () {
func(param)
}, doTime);
}
}
x(3, 3, function (info) {
console.log(info)
}, [1, 2, 3])
答案(二): 使用setInterval
- 使用setInterval, 在特定时间执行一次函数, 当指定次数完成后, 就停止定时器
var x = function (count, time, func, param) {
function y() {
console.log('执行一次: ' + count)
count--
func(param)
if (count !== 0) {
setTimeout(y, time * 1000)
}
}
setTimeout(y, time * 1000)
}
x(3, 3, function (info) {
console.log(info)
}, [1, 2, 3])
答案(三): 使用递归思想
- 使用递归的思想,
- 当一个执行器完成后, 如果次数还没有满, 就再相同的设置一个定制器, 整个定时器, 执行完成后再判断看看, 有没有次数达到上限, 没有完成的话, 就继续, 完成了, 就结束了, 不再设置定时器即可
- 这个方法的确定是, 当执行完成了, 但还是会等一个时间间隔, 才会清除定时器, 并停止.
var x = function (count, time, func, param) {
var timer = setInterval(function () {
count--
if (count >= 0) {
func(param)
} else {
clearInterval(timer)
}
}, parseInt(time * 1000))
}
x(3, 3, function (info) {
console.log(info)
}, [1, 2, 3])
最后
- 其实想看到更多的实现方法, 感觉很有意思.
- 始终没有找到关于异步的处理方法.
- 有时候就是想得太多了, 真是没有必要, 有些东西有简单的实现, 没必要绕很远的路. 多想几种方法, 能变得很有趣.