使用setInterval无法做计时功能吗?大神们帮忙看看!

Vict0r Chen 2015-07-25 12:03:52
为什么这些代码计时不了?

var ttt,ms = 0;
function Start() {
ttt = setInterval(function () {
ms += 1;
console.log("-----" + ms + "-----");
}, 1);
}
function Pause() {
clearInterval(ttt);
}

Start();//开始计时

console.warn("Start");
var array = new Array(100000);
for (var i = 0; i < array.length; i++) {
array[i] = 0;
if (i % 10000 == 0)
console.log(i);
}
console.warn("End");

Pause();//停止计时
console.log(ms);
...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2015-07-27
  • 打赏
  • 举报
回复
引用 7 楼 u010312979 的回复:
[quote=引用 6 楼 jslang 的回复:] [quote=引用 5 楼 u010312979 的回复:] [quote=引用 4 楼 jslang 的回复:] javascript是单线程的。只有当一个线程执行完毕,别的线程才能执行。 你的for循环时,循环所在的线程一直在执行。setInterval()开启的新线程会处于等待状态,直到循环所在的线程执行完毕才会执行。
清楚了,多谢大神! 再请教一个问题:

       var array = new Array(100000);
        for (var i = 0; i < array.length; i++) {
            array[i] = 0;
        }
这段代码如何优化?[/quote] 这段代码是要做什么的。只是给函数赋初值么? [/quote] 嗯,是的,初始化[/quote] 那没什么好优化的
Vict0r Chen 2015-07-27
  • 打赏
  • 举报
回复
引用 6 楼 jslang 的回复:
[quote=引用 5 楼 u010312979 的回复:] [quote=引用 4 楼 jslang 的回复:] javascript是单线程的。只有当一个线程执行完毕,别的线程才能执行。 你的for循环时,循环所在的线程一直在执行。setInterval()开启的新线程会处于等待状态,直到循环所在的线程执行完毕才会执行。
清楚了,多谢大神! 再请教一个问题:

       var array = new Array(100000);
        for (var i = 0; i < array.length; i++) {
            array[i] = 0;
        }
这段代码如何优化?[/quote] 这段代码是要做什么的。只是给函数赋初值么? [/quote] 嗯,是的,初始化
Vict0r Chen 2015-07-26
  • 打赏
  • 举报
回复
引用 4 楼 jslang 的回复:
javascript是单线程的。只有当一个线程执行完毕,别的线程才能执行。 你的for循环时,循环所在的线程一直在执行。setInterval()开启的新线程会处于等待状态,直到循环所在的线程执行完毕才会执行。
清楚了,多谢大神! 再请教一个问题:

       var array = new Array(100000);
        for (var i = 0; i < array.length; i++) {
            array[i] = 0;
        }
这段代码如何优化?
天际的海浪 2015-07-26
  • 打赏
  • 举报
回复
引用 5 楼 u010312979 的回复:
[quote=引用 4 楼 jslang 的回复:] javascript是单线程的。只有当一个线程执行完毕,别的线程才能执行。 你的for循环时,循环所在的线程一直在执行。setInterval()开启的新线程会处于等待状态,直到循环所在的线程执行完毕才会执行。
清楚了,多谢大神! 再请教一个问题:

       var array = new Array(100000);
        for (var i = 0; i < array.length; i++) {
            array[i] = 0;
        }
这段代码如何优化?[/quote] 这段代码是要做什么的。只是给函数赋初值么?
forwardNow 2015-07-25
  • 打赏
  • 举报
回复
var array = new Array(100000); for (var i = 0; i < array.length; i++) { array[i] = 0; if (i % 10000 == 0) console.log(i); } 上面这段代码一瞬间就执行完毕了,根本达不到阻塞或睡眠一段时间的功能, 而如果你把“var array = new Array(100000);”中的“100000”多加几个零,那么你的浏览器就崩了。
Vict0r Chen 2015-07-25
  • 打赏
  • 举报
回复
引用 1 楼 wuqinfei_cs 的回复:
你的代码确实可用,但为什么这样子就无法计时呢?是因为for循环时间太短还是说setInterval并不是真正意义上的异步?

    <script type="text/javascript">
        var ttt, ms = 0;

        function start() {
            ttt = setInterval(function () {
                ms += 1;
                console.log("-----" + ms + "-----");
            }, 1);
        }
        function pause() {
            clearInterval(ttt);
            if (pause.callback) {
                pause.callback();
            }
        }

        start();//开始计时

        console.warn("Start");

        pause.callback = function () {
            console.log("End");
            console.log(ms);
        };

        var array = new Array(100000);
        for (var i = 0; i < array.length; i++) {
            array[i] = 0;
            if (i % 10000 == 0)
                console.log(i);
        }
        //setTimeout(pause, 1 * 1000);// 2秒后停止计时
        pause();
    </script>
forwardNow 2015-07-25
  • 打赏
  • 举报
回复

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <!--  

    setInterval()/setTimeout() 这些函数是异步的,
    类似于多线程。

    -->
<script>
    var ttt,ms = 0;

    function start() {
        ttt = setInterval(function () {
            ms += 1;
            console.log("-----" + ms + "-----");
        }, 1);
    }
    function pause() {
        clearInterval(ttt);
        if ( pause.callback ) {  
            pause.callback();
        }
    }
     
    start();//开始计时
     
    console.warn("Start");

    pause.callback = function () {
        console.log( "End" );
        console.log( ms );
    };
    setTimeout( pause, 2 * 1000 );// 2秒后停止计时

</script>
</body>
</html>
天际的海浪 2015-07-25
  • 打赏
  • 举报
回复
javascript是单线程的。只有当一个线程执行完毕,别的线程才能执行。 你的for循环时,循环所在的线程一直在执行。setInterval()开启的新线程会处于等待状态,直到循环所在的线程执行完毕才会执行。

87,885

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧