Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.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
带JQuery的Typescript承诺似乎运行了两次?_Jquery_Typescript_Promise_Getjson - Fatal编程技术网

带JQuery的Typescript承诺似乎运行了两次?

带JQuery的Typescript承诺似乎运行了两次?,jquery,typescript,promise,getjson,Jquery,Typescript,Promise,Getjson,我以为我正在慢慢地掌握Typescript/JS中的承诺,但这让我感到困惑 我试图使用承诺来等待两个JQuery getJSON请求完成。使用我的浏览器——访问本地服务器——一切都正常:但是我从一个用户那里得到了一个HAR日志,显示getJSON请求是重复的,承诺解决了两次。我根本无法重现这种行为,但它对用户来说是一致的,使用Chrome71时禁用插件 我希望控制台输出是这样的 Document Ready File Loaded Query Loaded Got fil

我以为我正在慢慢地掌握Typescript/JS中的承诺,但这让我感到困惑

我试图使用承诺来等待两个JQuery getJSON请求完成。使用我的浏览器——访问本地服务器——一切都正常:但是我从一个用户那里得到了一个HAR日志,显示getJSON请求是重复的,承诺解决了两次。我根本无法重现这种行为,但它对用户来说是一致的,使用Chrome71时禁用插件

我希望控制台输出是这样的

   Document Ready
   File Loaded
   Query Loaded
   Got file and query
但是相反,在这台用户机器上,它更像这样

   Document Ready
   File Loaded
   Query Loaded
   File Loaded
   Query Loaded
   Got file and query
   Got file and query
下面是稍微简化的代码

class Panel {
  private pathName: string;

  constructor(name: string) {
    this.pathName = name;
  }

  async loadStuff(buster: string): Promise<any> {
    // start to fetch the file JSON. 
    let fileP = $.getJSON(this.pathName + "/file.json", { mtime: buster });

    // start to run the query
    let queryP = $.getJSON("/api/query");

    return fileP.then(async (data: any) => {
      console.log("File loaded");
      this.dosomething(data.objects);

      return queryP.then((qdata: any) => {
        console.log("Query loaded");
        this.dosomethingelse(qdata);
      });
    }
      , () => {
        alert("Error loading '" + this.pathName + "/file.json'");
      });
  }
}

$(() => {

  console.log("Document ready");

  let bp: Panel = new Panel("foo");  
  let promise: Promise<void> = bp.loadStuff("test");

  promise.then(() => {
    console.log("Got file and query");
  });
类面板{
私有路径名:字符串;
构造函数(名称:string){
this.pathName=name;
}
异步loadStuff(buster:string):承诺{
//开始获取JSON文件。
让fileP=$.getJSON(this.pathName+“/file.json”,{mtime:buster});
//开始运行查询
让queryP=$.getJSON(“/api/query”);
返回fileP.then(异步(数据:any)=>{
log(“加载的文件”);
这个.dosomething(data.objects);
返回queryP.then((qdata:any)=>{
console.log(“已加载查询”);
这是dosomethingelse(qdata);
});
}
, () => {
警报(“加载错误”“+this.pathName+”/file.json”“);
});
}
}
$(() => {
控制台日志(“文件准备就绪”);
设bp:Panel=新面板(“foo”);
让承诺:承诺=bp.loadStuff(“测试”);
答应。然后(()=>{
log(“获取文件和查询”);
});

我最好的猜测是,我对承诺做了一些错误的事情,这些承诺只是由于用户计算机上的网络定时条件触发的。但我不知道是什么!

这可能不是一个直接的答案,但如果您等待承诺,就更容易对代码进行推理

class Panel {
  private pathName: string;

  constructor(name: string) {
    this.pathName = name;
  }
  async loadStuff(buster: string): Promise<any> {
    try {
      // start to fetch the file JSON.
      let fileP = await $.getJSON(this.pathName + '/file.json', {
        mtime: buster,
      });
      this.dosomething(fileP.objects);

      // start to run the query
      let queryP = await $.getJSON('/api/query');
      this.dosomethingelse(queryP);
    } catch (e) {
      alert("Error loading '" + this.pathName + "/file.json'");
    }
  }
}
类面板{
私有路径名:字符串;
构造函数(名称:string){
this.pathName=name;
}
异步loadStuff(buster:string):承诺{
试一试{
//开始获取JSON文件。
让fileP=wait$.getJSON(this.pathName+'/file.json'{
时间:巴斯特,
});
此.dosomething(fileP.objects);
//开始运行查询
让queryP=wait$.getJSON('/api/query');
这是dosomethingelse(queryP);
}捕获(e){
警报(“加载错误”“+this.pathName+”/file.json”“);
}
}
}

您是否查看了来自
/api/query
的实际响应消息?这是“用户”吗获得相同的准确响应?或者这里涉及到身份验证吗?这个JS是如何执行或附加到文档的?您是否可以因为布局而绑定多个事件?@AussieJoe HAR文件中的响应看起来非常好。没有身份验证问题。起初我认为可能是Jquery文档准备好了触发两次,但控制台日志只有一次“Document Ready”(文档准备就绪)。值得一试,但这消除了我希望能够提高性能的两个getJSON请求上的重叠。您可以使用
let[filep,queryp]=wait Promise.all([])
并行执行。