以下是如何实现一个测试套件的实现,该套件使用来自Jon Resig 的《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>
我知道推入队列的每个函数都需要在异步调用之前调用,并且需要在异步调用结束之后调用。但是我看不到测试套件将如何结束。在最后一个测试结束时,flag 的值将是 false,因为最后一个测试会在完成自身后调用,并依次用 a调用 resume 。在我看来就像一个无限循环。有人可以解释一下吗?pause()
resume()
pause
resume()
runTest()
setTimeout()