1

我的生产代码有这段逻辑,是从 CoffeeScript 编译的:

results = [];
results.push(slowOpA());
results.push(slowOpB());
results.push(slowOpC());
results = _.flatten(results);
$.when.apply($, results).then(onComplete).fail(onError).always(function() {
    $(document).trigger('stop')
});

我希望这首先按顺序调用所有 slowOp* 方法,然后调用其中一个onComplete或仅调用onError一次,最后仅调用always一次。这就是我用 Jasmine 测试的内容:

@stopSpy = jasmine.createSpy '<stopSpy>'
$(document).bind 'stop', @stopSpy
...
@lastPromise = new $.Deferred()
spyOn('slowOpA').andReturn new $.Deferred().resolve()
spyOn('slowOpB').andReturn new $.Deferred().resolve()
spyOn('slowOpC').andReturn @lastPromise
...
@lastPromise.resolve()
expect(@stopSpy).toHaveBeenCalledOnce()

100 次中有 99 次有效,但时不时地会收到 2 或 3 个调用:

Expected spy on <stopSpy> to have been called once, but was called '2' times

我错过了什么吗?或者这是 jQuery/Jasmine 中一些模糊的竞争条件?

4

1 回答 1

1

我不熟悉 Jasmine,但您的 JavaScript 代码是正确的;我在 jsFiddle 中模拟了一些等效的东西,它按预期工作。我用 'done(onComplete)' 和 'then(onComplete, onError)' 交换了 'then(onComplete)' 但一切都按预期工作。我假设 slowOpX 返回的延迟/承诺。下划线 (?) _.flatten(results) 是多余的,但我怀疑这会导致任何问题。

于 2012-08-02T22:22:13.603 回答