Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery延迟的怪异_Javascript_Jquery_Asynchronous_Jquery Deferred - Fatal编程技术网

Javascript jQuery延迟的怪异

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) { //

我正在编写一个实现延迟的小脚本,并运行了一些代码,这些代码的行为与我期望的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()
方法内部设置的。

那么,如果我将
模型
绑定为
dfd.resolve的上下文,它是否仍然有效?如下所示:
model.always(dfd.resolve.bind(model))
。要在第二个代码段中获得与第一个代码段相同的结果,您必须找到To
dfd
,而不是像这样的To
model
$.get(“filename.json”).always(dfd.resolve.bind(dfd))
但我不知道为什么这比第一个代码片段更好,因为第一个代码片段更清楚发生了什么。同意。我只是有点哲学色彩,并没有建议这样做。谢谢你们两位的帮助。今天晚上我太懒了,没法深入探究它为什么会这样工作。