【问题标题】:jQuery $.Deferreds and $.eachjQuery $.Deferreds 和 $.each
【发布时间】:2013-03-12 14:25:51
【问题描述】:

尝试使用 $.Deferreds 代替我之前使用的 setTimeOut。 我遇到了一个问题,因为 writer() 实际上并没有完成,因为 $.each 在调用 printer() 时仍在循环。

我还没有看到带有循环的 $.Deferreds 的示例。显然,以下内容是错误的,我打赌这与决心有关 - 任何帮助将不胜感激。

$.when( writer() ).done(function() {
    printer();
});


function writer(){
    var deferred = new $.Deferred();
    if(x){
        $("a").each(function () {...});
    }
    if(y){
        $("img").each(function () {...});
    }
    if(z){
        $("div").each(function () {...});
    }
    deferred.resolve();
    return deferred.promise();

}

function printer(){...}

【问题讨论】:

  • 想一想,你总是在返回它之前解决它,所以.done总是会在调用writer之后立即发生,无论你的@987654324内部是否有任何异步事件@ 完成。如果您没有在 $.each 中进行任何异步工作,则不需要延迟对象。
  • @KevinB - 这正是我认为正在发生的事情,只是不确定如何在触发打印机之前返回多个延迟
  • 不相关,但你为什么要在一个最多只包含一个元素的 jQuery 对象上调用 .each()
  • 我必须知道异步事件是什么,$.each 是同步的,这意味着 printer 在所有 $.each 完成之前无法运行。
  • @AnthonyGrist - 把它当作代码,不好的例子 - 将编辑。

标签: jquery each jquery-deferred


【解决方案1】:

假设.each 内部的... 正在执行一个异步事件,您需要所有这些异步事件返回一个延迟对象,您可以将其传递给$.when 以触发您的解析。

此外,在代码的顶部,您不需要 $.when 进行单个回调,只需执行 writer().done(function(){...})

【讨论】:

  • 查看更新 - $.each 包含在 if 中 - 那么如何返回 $.each 中的延迟并确保所有返回的都是真的?
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2013-09-28
  • 2011-06-08
  • 2012-06-09
相关资源
最近更新 更多