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

How this asynchronous test suite built in JavaScript will terminate?

本文关键字:何终止 终止 套件 测试 JavaScript 构建 异步      更新时间:2023-09-26

以下是如何实现一个测试套件的实现,该套件使用Jon Resig的《JavaScript忍者的秘密》一书中的中央计时器控件执行异步测试。

      (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(),并继续使用setTimeout()调用runTest()。在我看来就像一个无限的循环。有人能解释一下吗?

[…]resume依次用setTimeout()调用runTest()

是的,但runTest()什么都不做(因为queue.length将是0,这是错误的):没有运行新的测试,没有对resume()的进一步调用,什么都没有。