【问题标题】:jQuery Deferred weirdnessjQuery延迟怪异
【发布时间】:2012-09-06 23:27:31
【问题描述】:

我正在编写一个实现延迟的小脚本,并遇到了一些与我期望的 Javascript 不同的代码。

var dfd = $.Deferred()
  , view  = $.get("filename.tmpl");

$.get("filename.json")
  .always(function (model) {
    dfd.resolve(model);
  });

$.when(view, dfd)
  .done(function (view, model) {
    // do stuff with view - even if there is no model
  });

这很好用,但是当我重构它时它停止工作:

var dfd = $.Deferred()
  , view  = $.get("filename.tmpl");

$.get("filename.json").always(dfd.resolve);

$.when(view, dfd)
  .done(function (view, model) {
    // do stuff with view - even if there is no model
  });

我看不出有什么理由不应该这样做。该函数期望第一个参数是模型或未定义。

【问题讨论】:

    标签: javascript jquery asynchronous jquery-deferred


    【解决方案1】:

    当你这样做时:

    $.get("filename.json").always(dfd.resolve);
    

    而不是这个:

    $.get("filename.json")
      .always(function (model) {
        dfd.resolve(model);
    });
    

    您将获得一个不同的对象作为this 指针传递给resolve() 方法。第二个将在dfd 的上下文中调用它。第一个将调用它从您的$.get() 返回的延迟对象的上下文,这是不同的。

    重要的是要记住,当传递一个回调dfd.resolve 时,只会得到一个指向该方法的指针。它不会设置调用resolve 的上下文。这是在.always() 方法内部设置的。

    【讨论】:

    • 那么,如果我将model 绑定为dfd.resolve 的上下文,它是否仍然有效?像这样:model.always(dfd.resolve.bind(model));.
    • 要在第二个代码 sn-p 中获得与第一个 sn-p 相同的结果,您必须找到 dfd,而不是 model,如下所示:$.get("filename.json").always(dfd.resolve.bind(dfd)); 但是我不知道为什么这比第一个代码 sn-p 更好,这使发生的事情更清楚。
    • 同意。我只是在哲学上打蜡,而不是建议应该那样做。谢谢你们的帮助。今天晚上我太懒了,没有深入研究它为什么会这样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多