收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 4107|回复: 4

[求助] 不使用全局变量怎么写一个时间自增的轮询方法

[复制链接]
发表于 2018-6-22 15:30:14 | 显示全部楼层 |阅读模式
今天去面试遇到的一道题,想了好久没想出来,被鄙视了。
要求:
1、poll方法接收两个函数,checkStatus和callback,其中checkStatus返回值是布尔类型,true或false,callback是回调函数。
2、如果checkStatus返回true,执行callback,否则继续执行checkStatus但是需要延时。
3、轮询时间需要不断增加,第一次执行checkStatus返回false之后,需要1000ms再执行第二次,以后每一次的时间都要增加1.5倍。
4、不得使用全局变量

我写的这样,但是很明显,人家话都不想跟我多说两句。。。
  1. function time1(){
  2.         var t = 1000;
  3.         return function(){
  4.                 t *= 1.5;
  5.                    return t;
  6.         }
  7. }
  8. var time3 = time1();
  9. function poll(checkStatus,callback){
  10.         if(checkStatus()){
  11.                 callback();
  12.         }else{
  13.                 setTimeout(function(){
  14.                         console.log(new Date());
  15.                         poll(checkStatus,callback);
  16.                 },time3());
  17.         }
  18. }
  19. function checkStatus(){
  20.         return 0;
  21. }
  22. function callback(){
  23.         console.log('callback');
  24. }
  25. poll(checkStatus,callback);
复制代码
发表于 2018-9-4 18:39:45 | 显示全部楼层
本帖最后由 abaddonpoet 于 2018-9-4 18:42 编辑

function poll(checkStatus,callback){
            callback=callback||function(){}
        let time = 1000;
        (function(){
            callback();
            if(checkStatus()){
                callback();
            }else{
                var _self = arguments;
                setTimeout(function(){
                    time = (time * 1.5) | 0;
                    _self.callee();
                },time);
            }
        })();
    }



我猜考点可能是匿名函数,然后涉及匿名函数递归,然后setTimeout的作用域。。等等等等。。突然坑越挖越深。。。
我觉得代码里埋点小机巧小花样,让主考官觉得你是与时俱进的行内人。。这点特别重要。。。这几年我都在这些邪门歪道上浸淫了_(:з」∠)_
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-6-23 13:34:02 | 显示全部楼层
昨晚洗澡的时候突然想到,我似乎掉坑里去了。。。
正确的实现方式也许是这样的。。。
  1. function poll(checkStatus,callback){
  2.         var time = 1000;
  3.         function poll2(){
  4.                 if(checkStatus()){
  5.                         callback();
  6.                 }else{
  7.                         setTimeout(function(){
  8.                                 time *= 1.5;
  9.                                 console.log(new Date().getTime());
  10.                                 poll2(checkStatus,callback);
  11.                         },time);
  12.                 }
  13.         }       
  14.         return poll2;
  15. }
  16. function checkStatus(){
  17.         return 0;
  18. }
  19. function callback(){
  20.         console.log('callback');
  21. }
  22. var poll3 = poll(checkStatus,callback);
  23. poll3();
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-23 13:37:18 | 显示全部楼层
至于为什么我一直使用闭包,是因为面试的题目就写着闭包。。。
如果不用闭包,这个可以写的更简单。。。
  1. function poll(checkStatus,callback){
  2.         var time = 1000;
  3.         function poll2(){
  4.                 if(checkStatus()){
  5.                         callback();
  6.                 }else{
  7.                         setTimeout(function(){
  8.                                 time *= 1.5;
  9.                                 console.log(new Date().getTime());
  10.                                 poll2(checkStatus,callback);
  11.                         },time);
  12.                 }
  13.         }       
  14.         poll2();
  15. }
  16. function checkStatus(){
  17.         return 0;
  18. }
  19. function callback(){
  20.         console.log('callback');
  21. }
  22. poll(checkStatus,callback);
复制代码
回复 支持 反对

使用道具 举报

发表于 2018-11-11 12:47:52 | 显示全部楼层
这几年我都在这些邪门歪道上浸淫了


非常同意!确实是这样。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2019-10-20 01:34 , Processed in 0.093514 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表