Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.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 $。延迟为成员变量_Javascript_Jquery - Fatal编程技术网

Javascript $。延迟为成员变量

Javascript $。延迟为成员变量,javascript,jquery,Javascript,Jquery,有了面向对象语言的背景,我正试图学习一些jquery,并将注意力集中在异步调用上。我的意图是创建一个javascript对象来包含异步api调用的结果,并能够询问所述对象是否已完成加载 我一直在尝试使用jquery中的Deferred来实现它,我可以让代码片段像文档示例中那样工作,但是当我将Deferred放在类中时,它不会按照我期望的顺序执行 如何使用$.Deferred作为成员变量创建javascript对象 (我所附代码中的超时是为了模拟api调用中的延迟) 一些问题: 您在某些地方引用

有了面向对象语言的背景,我正试图学习一些jquery,并将注意力集中在异步调用上。我的意图是创建一个javascript对象来包含异步api调用的结果,并能够询问所述对象是否已完成加载

我一直在尝试使用jquery中的Deferred来实现它,我可以让代码片段像文档示例中那样工作,但是当我将Deferred放在类中时,它不会按照我期望的顺序执行

如何使用$.Deferred作为成员变量创建javascript对象

(我所附代码中的超时是为了模拟api调用中的延迟)

一些问题:

  • 您在某些地方引用了错误的对象/变量(
    this.def
    不存在,
    this.defThis
    defVar
    从不使用)

  • 不是在超时回调函数中定义的(或者是在sloppy模式下的
    窗口
    ),因此您需要使用解决方案(有几种可能性,例如
    绑定

  • 您从未解析
    defVar

  • 您使用了一个
    isdone
    变量,因此请务必意识到,一旦将其设置为
    true
    ,它将保持
    true
    ,并且很少涉及其他承诺

以下是更正代码(简化:省略文档内容的更改):

var isdone=false;
var def=$.Deferred();
$.when(def).done(函数(){
控制台日志(“检查顶级isdone”+isdone);
isdone=false;//设置回false
});
var delayedCall=函数(){
setTimeout(函数(){
isdone=true;
def.resolve();
},500);//半秒钟
}
delayedCall();
//内部功能
函数DelayedObject(){
this.defThis=$.Deferred();
var defVar=$.Deferred();
this.delayedObjCall=函数(){
setTimeout(函数(){
//5秒后解决
isdone=true;
this.defThis.resolve();//引用正确的对象
}.bind(this),1000);//使用bind提供正确的上下文
//还应解决其他问题:
setTimeout(函数(){
//5秒后解决
isdone=true;
defVar.resolve();
}.把(这个)装订好;稍晚一点
}
this.delayedObjCall();
this.getStatusThis=函数(){
return this.defThis;//返回正确的对象
}
this.getStatusVar=函数(){
return defVar;//返回正确的对象
}
}
delObj=新的延迟对象();
$.when(delObj.getStatusThis()).done(function()){
日志(“检查delObj(此)isdone”+isdone);
isdone=false;//设置回false
});
$.when(delObj.getStatusVar()).done(function()){
console.log('checking delObj(var)isdone'+isdone)
isdone=false;//设置回false
});
$(窗口).on(“加载”,函数(){
console.log(“页面加载”);
});

this.def
this.defThis
defVar
???我知道,为了更好地说明我的问题,我在这里加入了多个。可能在代码注释中提到过
<!DOCTYPE html>
<html>
   <body>
     <script src="jquery-3.1.1.js"></script>
     <script>
        //top level
        var isdone = false;
        var def = $.Deferred();

        $.when(def).done(function() {
          var msg = "checking topLevel isdone " + isdone;
          console.log(msg);
          $("body").append("<p>" + msg + "</p>");
        })

        var delayedCall = function() {
          setTimeout(function() {
            //resolve after 5 seconds
            isdone = true;
            def.resolve();
          }, 1000);
        }
        delayedCall();



        //inside function
        function DelayedObject()
        {
          this.defThis = $.Deferred();
          var defVar = $.Deferred();
          this.delayedObjCall = function()
          {
            setTimeout(function()
            {
              //resolve after 5 seconds
              isdone = true;
              this.def.resolve();
            }, 1000);
          }
          this.delayedObjCall();
          this.getStatusThis = function()
          {
            return this.def;
          }
          this.getStatusVar = function()
          {
            return this.def;
          }
        }

        delObj = new DelayedObject();
        $.when(delObj.getStatusThis() ).done(function() {
          var msg = "checking delObj (this) isdone " + isdone;
          console.log(msg)
          $("body").append("<p>" + msg + "</p>");
        });
        $.when(delObj.getStatusVar() ).done(function() {
          var msg = "checking delObj (var) isdone " + isdone;
          $("body").append("<p>" + msg + "</p>");
          console.log(msg)
        });

        $(window).on("load", function()
        {
          var msg = "<p>" + " Page loaded " + "</p>";
          $("body").append(msg);
          console.log(msg);
        });
      </script>
    </body>
  </html>
checking delObj (this) isdone false

checking delObj (var) isdone false

Page loaded

checking topLevel isdone true