您的位置:首页 > 编程语言

一道简单的编程题_ 关于定时器.

2017-07-27 09:33 260 查看

一道编程题


在群里有人发了一道编程题, 起初以为很简单, 尝试写了写, 没做出来.也真是尴尬. 记录下.

最后也没能实现关于异步的处理.


题目概要

编写一个函数
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])

最后

其实想看到更多的实现方法, 感觉很有意思.

始终没有找到关于异步的处理方法.

有时候就是想得太多了, 真是没有必要, 有些东西有简单的实现, 没必要绕很远的路. 多想几种方法, 能变得很有趣.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: