【问题标题】:jQuery progress repeated calls when using $.when使用 $.when 时 jQuery 进度重复调用
【发布时间】:2012-03-15 22:31:08
【问题描述】:

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

在此处查看小提琴:http://jsfiddle.net/wKTgP/1/

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

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

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

'你好未定义'

'你好世界'

第一个通知显然显示了来自promise1 的消息,而promise2 还没有发送任何东西......但是第二个通知让我认为promise1 再次发送了“hello”,而promise2 第一次发送了“world”。 ..

这是什么故事?

【问题讨论】:

  • 当 promise2 实现时,第一个 promise 仍处于“已实现”状态。
  • 是的 - 我相信这是我感知“通知”的方式的问题 - 命名(通知)意味着“事件”类型机制,最好称其为“状态”,因为它实际上设置了延迟实例的“进度状态”。现在我明白了,它更有意义。
  • 我之前没用过,但是在进度中激活时可能有通知清除机制?我也在努力理解它。
  • 好的。如果你想要“hello undefined”和“undefined world”,我猜你可以解决或拒绝正在进行的承诺。

标签: jquery jquery-deferred


【解决方案1】:

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

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

将立即记录“hello”。

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

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

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

【讨论】:

  • 感谢 Julian - 现在非常有意义。
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 2016-02-01
  • 2013-03-09
  • 2015-10-08
  • 2023-04-08
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多