jQuery延迟了怪异

时间:2012-09-06 23:27:32

标签: javascript jquery asynchronous jquery-deferred

我正在开发一个实现延迟的小脚本,并且遇到了一些代码,这些代码的行为与我期望的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
  });

我认为没有任何理由不这样做。该函数期望第一个参数是模型或未定义。

1 个答案:

答案 0 :(得分:2)

执行此操作时:

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

而不是:

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

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

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