jQuery延迟怪异

jQuery Deferred weirdness

本文关键字:延迟 jQuery      更新时间:2023-09-26

我正在编写一个实现延迟的小脚本,并运行了这一小段代码,但它的行为并不像我期望的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
  });

我看不出有什么理由不这样做。函数要求第一个参数为模型或未定义。

执行此操作时:

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

而不是这个:

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

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

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