【问题标题】:$.when with array of jQuery deferreds sometimes calls .always multiple times$.when 与 jQuery 延迟数组有时会调用 .always 多次
【发布时间】:2012-07-21 07:59:54
【问题描述】:

我的生产代码有这个逻辑块,是从 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* 方法,然后只调用一次 onCompleteonError,最后只调用一次 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 中的一些晦涩的竞争条件?

【问题讨论】:

    标签: jquery coffeescript jasmine jquery-deferred


    【解决方案1】:

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

    【讨论】:

    • 我得出了同样的结论:问题出在其他规范中,而不是代码。我们也不是第一次看到 Jasmine 做这样的事情。 叹息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2013-03-09
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多