当使用$ .when时,jQuery会重复调用

时间:2012-03-15 22:31:08

标签: jquery jquery-deferred

我正在使用jQuery延迟,并注意到一种奇怪的行为。

请参阅此处的小提琴:http://jsfiddle.net/wKTgP/1/

如果我使用$ .when来调用一组承诺

$.when(promise1, promise2)
    .progress(function (message1, message2) {
        alert(message1 + ' ' + message2);
    });

如果promise1发送通知'hello',并且promise2发送'world',我会收到两个消息框:

'你好未定义'

'hello world'

第一个通知显然显示来自promise1的消息,而promise2还没有发送任何内容......但是SECOND通知让我认为promise1已经发送'hello'AGAIN,而promise2首次发送'world'。 ..

这是怎么回事?

1 个答案:

答案 0 :(得分:4)

请记住,当您将进度处理程序附加到已经进行的承诺时,将立即使用最新进度值调用回调:

$.Deferred().notify( "hello" ).progress(function( value ) {
    console.log( value );
});

立即记录“你好”。

现在,$ .when返回复合承诺。因此,每当其中一个组件进展时,复合承诺就会进展。

鉴于最新的通知值保留在“内存中”,并且当其中一个组件进展时,$。当进程返回复合承诺时,那么进度值应该是所有组件的并集是完全合理的。加入承诺进度值,即使只有一个进展

[ "hello", undefined ]
[ "hello", "world" ]