我正在编写一个实现延迟的小脚本,并遇到了这一小段代码,该代码的行为与我期望的 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()
方法内部设置的。
关于javascript - jQuery 延迟的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309822/