zoukankan      html  css  js  c++  java
  • 一道简单的编程题_ 关于定时器.

    一道编程题

    在群里有人发了一道编程题, 起初以为很简单, 尝试写了写, 没做出来.也真是尴尬. 记录下.
    最后也没能实现关于异步的处理.

    题目概要

    • 编写一个函数 var x = function(count, time, func, param){};
    • 该函数有四个参数, 实现的功能为每隔time秒执行一次func函数, 执行count
    • param为传到func函数里的参数, param是数组类型, func函数的形式

    解题思路

    1. 起初以为很简单, 只是简单的考察一些基本的知识点, 事实上, 我大意了.
    2. 首先是time, 一定是一个定时器, 想到了setTimeOut,
    3. 然后是count, 多少个, 也就是一个有多少个定时器, 然后, 经过一定时间就执行一次.
    4. 后面就简单了, 回调函数, 往里面传入一个参数.
    5. 失败的地方遇到了, 首先是, 如果是定时器的话, 用for循环, 那么时间到了, 刷, 一下子,全都执行了.
    6. 还有一个点就是关于如何控制次数的, 这个比较容易解决.
    7. 当时错误的主要地方就是: 关于如何控制定时器的时间, 如果传入不同的时间, 那就是一次分发多个不同的定时器, 如果传入的是同一个时间, 没有找到一个定时器执行完成了, 另一个定时器再执行的方法.
    8. 其实刚刚自己尝试了很多, 函数立即执行, 闭包, 都没有能实现需求.

    答案(一): 一次分发多个定时器

    • 这种思路是, 自己在不能控制定时器一个执行完成后, 再执行另外一个时候找到的.
    • 当然, 自己刚刚开始, 在传入的时间那里, 有点乱了.
    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])
    

    最后

    • 其实想看到更多的实现方法, 感觉很有意思.
    • 始终没有找到关于异步的处理方法.
    • 有时候就是想得太多了, 真是没有必要, 有些东西有简单的实现, 没必要绕很远的路. 多想几种方法, 能变得很有趣.
  • 相关阅读:
    linux环境变量(一)
    linux常用命令-ps
    linux实用小命令--查看文本内容
    postman tests常用方法
    Vue 中嵌套 Iframe,用postMessage通信 踩坑记
    [Vue warn]: Error in nextTick: "RangeError: Maximum call stack size exceeded"
    对STM32所用位带操作宏的详细剖析
    移植Modbus TCP二
    移植Modbus TCP一
    STM32位带操作
  • 原文地址:https://www.cnblogs.com/zhangrunhao/p/7243102.html
Copyright © 2011-2022 走看看