setInterval工作setTimeout不工作;t

setInterval works setTimeout doesn't

本文关键字:工作 setTimeout setInterval      更新时间:2024-05-14

我目前正在为使用APM 1.6.0、Node 0.10.40和Jasmine 1.3的Atom包编写异步规范。不幸的是,我无法使setTimeout工作。

由于Jasmine 1.3使用顺序runs-块来允许异步测试,所以我试图从文档中理解这个示例。

事实证明,setTimeout-回调从未被调用过。

在查找可能发生这种情况的原因时,我将setTimeout-语句重命名为setInterval(因为两个函数都有相同的签名)。

如果我执行以下代码

describe('an asynchronous test', () => {
    it('should do some async stuff', () => {
        runs(() => {
            setInterval(() => {
                console.info('async');
            }, 75);
            setTimeout(() => {
                console.info('async2');
            }, 75);
        });
        waitsFor(() => {
            return false;
        }, 'missing events'); // will wait ~5 seconds.
    });
});

我得到以下输出:

async
async
async
...

为什么setInterval-功能正常工作,而setTimeout完全不工作?

编辑:问题的第一个版本没有提到规范是在Atom环境中运行的。原谅

我终于通过这篇文章找到了解决方案。它导致了规范助手文件,其中setTimeout被Jasmine间谍截断。

为了使setTimeout再次工作,有必要用jasmine.unspy()清除间谍。在调用了setTimeout之后,可以使用spyOn()重新激活间谍。

以下几行说明了我上面的例子:

runs(() => {
    // disable spy
    jasmine.unspy(window, 'setTimeout');
    setTimeout(() => {
        console.info('async2');
    }, 75);
    // reenable spy
    spyOn(window, 'setTimeout')
        .andCallFake(window.fakeSetTimeout);
});