Javascript jQuery延迟的怪异
我正在编写一个实现延迟的小脚本,并运行了一些代码,这些代码的行为与我期望的Javascript不同Javascript jQuery延迟的怪异,javascript,jquery,asynchronous,jquery-deferred,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) { //
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()
方法内部设置的。那么,如果我将模型
绑定为dfd.resolve的上下文,它是否仍然有效?如下所示:model.always(dfd.resolve.bind(model))
。要在第二个代码段中获得与第一个代码段相同的结果,您必须找到Todfd
,而不是像这样的Tomodel
:$.get(“filename.json”).always(dfd.resolve.bind(dfd))
但我不知道为什么这比第一个代码片段更好,因为第一个代码片段更清楚发生了什么。同意。我只是有点哲学色彩,并没有建议这样做。谢谢你们两位的帮助。今天晚上我太懒了,没法深入探究它为什么会这样工作。