这个用JavaScript构建的异步测试套件将如何终止?

时间:2013-07-28 18:15:54

标签: javascript asynchronous timer

以下是如何实现一个测试套件的实现,该测试套件使用Jon Resig的书籍Secrets of JavaScript Ninja中的中央计时器控件执行异步测试。     

      (function() {

        var queue = [], paused = false;                //#1

        this.test = function(fn) {                     //#2
          queue.push(fn);
          runTest();
        };

        this.pause = function() {                      //#3
          paused = true;
        };

        this.resume = function() {                     //#4
          paused = false;
          setTimeout(runTest, 1);
        };

        function runTest() {                           //#5
          if (!paused && queue.length) {
            queue.shift()();
            if (!paused) resume();
          }
        }
      })();

这就是作者如何设置test()功能的步伐:

      test(function() {
        pause();
        setTimeout(function() {
          assert(true, "First test completed");
          resume();
        }, 100);
      });

      test(function() {
        pause();
        setTimeout(function() {
          assert(true, "Second test completed");
          resume();
        }, 200);
      });

    </script>

我知道推入队列的每个函数需要在异步调用之前调用pause(),并且需要在异步调用之后调用resume()电话结束了。 但我没有看到测试套件将如何结束。在最后一次测试结束时,pause标志的值将为false,因为上一次测试在完成后会调用resume(),然后使用{{1}继续调用runTest() }。对我来说就像一个无限循环。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

  

[...]简历依次使用runTest()来调用setTimeout()

是的,但是runTest()没有做任何事情(因为queue.length将是0,这是假的):没有新的测试运行,没有进一步调用{{1没什么。