2

我正在编写一个实现延迟的小脚本,并遇到了一些与我期望的 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
  });

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

4

1 回答 1

2

当你这样做时:

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

而不是这个:

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

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

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

于 2012-09-06T23:35:23.620 回答