我正在使用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'。 ..
这是怎么回事?
答案 0 :(得分:4)
请记住,当您将进度处理程序附加到已经进行的承诺时,将立即使用最新进度值调用回调:
$.Deferred().notify( "hello" ).progress(function( value ) {
console.log( value );
});
立即记录“你好”。
现在,$ .when返回复合承诺。因此,每当其中一个组件进展时,复合承诺就会进展。
鉴于最新的通知值保留在“内存中”,并且当其中一个组件进展时,$。当进程返回复合承诺时,那么进度值应该是所有组件的并集是完全合理的。加入承诺进度值,即使只有一个进展:
[ "hello", undefined ]
[ "hello", "world" ]