Javascript 然后仅在方法返回承诺完成后调用 submitTCtoDB(){ log(“this.selectedFileList是:”+this.selectedFileList) 这个.readFile()。然后(()=>{ 警报(“ReadFile已完成,现在提交TC”); 这个.submitTC() }); } readFile(){ 返回新承诺((解决、拒绝)=>{ for(设i=0;i{ this.fileContent=fileReader.result; if(this.fileContent.indexOf(“结束数据|开始结果”)!=-1){ 警报(“在“+file.name+”文件中找到多个测试用例。请在Calc Builder中分离/保存测试用例,然后重新导入”); const index:number=this.selectedFileList.indexOf(文件); 如果(索引>-1){ 这个.selectedFileList.splice(索引,1); } console.log(this.fileContent); } 解析(this.fileContent); } readAsText(文件); } }); }

Javascript 然后仅在方法返回承诺完成后调用 submitTCtoDB(){ log(“this.selectedFileList是:”+this.selectedFileList) 这个.readFile()。然后(()=>{ 警报(“ReadFile已完成,现在提交TC”); 这个.submitTC() }); } readFile(){ 返回新承诺((解决、拒绝)=>{ for(设i=0;i{ this.fileContent=fileReader.result; if(this.fileContent.indexOf(“结束数据|开始结果”)!=-1){ 警报(“在“+file.name+”文件中找到多个测试用例。请在Calc Builder中分离/保存测试用例,然后重新导入”); const index:number=this.selectedFileList.indexOf(文件); 如果(索引>-1){ 这个.selectedFileList.splice(索引,1); } console.log(this.fileContent); } 解析(this.fileContent); } readAsText(文件); } }); },javascript,angular,typescript,es6-promise,filereader,Javascript,Angular,Typescript,Es6 Promise,Filereader,我只想在readFile方法完全完成后运行submitTC()方法,但是(在submitTCtoDB内部)会被提前调用 我想。那么,还是承诺用得不好 所需的功能是仅当readFile方法完成读取/拼接文件时才调用submitTC方法。 请提供帮助。您在循环中有一个resolve调用,但是resolve只有在第一次调用时才有效:一旦承诺解决,这就是它的最终状态,然后触发回调。因此,当第一个文件被读取时就会发生这种情况,而不必等待任何其他文件被处理 你能做的是: 在不添加特定逻辑的情况下提示Fil

我只想在readFile方法完全完成后运行submitTC()方法,但是(在submitTCtoDB内部)会被提前调用

我想。那么,还是承诺用得不好

所需的功能是仅当readFile方法完成读取/拼接文件时才调用submitTC方法。
请提供帮助。

您在循环中有一个
resolve
调用,但是
resolve
只有在第一次调用时才有效:一旦承诺解决,这就是它的最终状态,然后触发
回调。因此,当第一个文件被读取时就会发生这种情况,而不必等待任何其他文件被处理

你能做的是:

  • 在不添加特定逻辑的情况下提示
    FileReader
    (您的
    if
    检查):将其保留在它之外,这样它仍然是通用的
  • 使用
    Promise.all
    将文件列表映射到将给出文件内容列表的新Promise
  • 处理特定检查的内容列表
  • 将新承诺(
    promise.all
    或其上链接的承诺)返回给调用者
代码:


不要在
newpromise
中放入该循环,除了单个异步调用之外,不要放入任何功能。然后使用promise mechanics将所有内容组合在一起。@Bergi但我需要将所有文件逐个传递给fileReader。然后怎么办?编写一个函数,获取单个文件并读取它。编写另一个处理文件列表的函数。@Bergi非常感谢,我将尝试它。.我可以在submitTCtoDB方法中保留for循环,并为循环调用readFile方法evrytime吗?是的,请尝试,这是在任何情况下正确使用承诺的第一步:-)我不确定该方法应该做什么,也许这个循环行不通。您需要一个后跟
Promise.all
的循环来等待在循环中启动的所有异步工作,或者需要一个递归(或
async
/
wait
)顺序循环的解决方案。@trincot----最后一个查询仍未解决,先生..当多个文件被传递时,它获取了错误的文件。请检查要拒绝的文件是否返回false。输出文件名以确保。逻辑是好的。是的,如果为false,我得到的是被拒绝的文件,如果为true,我得到的是另一个文件,但是在arrray上应用splice时,它会出错……谢谢。splice?你不应该这样做。这不是我的答案。过滤器的工作很好。结果应分配到submitTCtoDB中。仅此而已。那么我将如何从seletedFileList中删除无效文件…因为调用submitTC方法时seletedFileList不应包含这些文件。
submitTCtoDB() {
  console.log("this.selectedFileList is:  " + this.selectedFileList)
  this.readFile().then(() => {
    alert("ReadFile Finished now submit TC");
    this.submitTC()
  });
}

readFile() {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < this.selectedFileList.length; i++) {
      let file = this.selectedFileList[i];
      alert("file in redafile" + file.name)
      let fileReader = new FileReader();
      fileReader.onload = () => {
        this.fileContent = fileReader.result;
        if (this.fileContent.indexOf("END DATA | BEGIN RESULTS") != -1) {
          alert("Multiple testcases found in " + file.name + " file.  Please separate/save testcases in Calc Builder. Then reimport");
          const index: number = this.selectedFileList.indexOf(file);

          if (index > -1) {
            this.selectedFileList.splice(index, 1);
          }

          console.log(this.fileContent);

        }
        resolve(this.fileContent);
      }
      fileReader.readAsText(file);
    }
  });
}
submitTCtoDB() {
    console.log("this.selectedFileList is:  " + JSON.stringify(this.selectedFileList))
    this.readFileList(this.selectedFileList).then((validList) => {
        alert("ReadFile Finished now submit TC");
        this.selectedFileList = validList;
        this.submitTC()
    });
}

readFileList(list) {
    return Promise.all(list.map(file => this.readFile(file))).then(contents => {
        return list.filter((file, i) => {
            const fileContent = contents[i];
            if (fileContent.indexOf("END DATA | BEGIN RESULTS") != -1) {
                console.log("Multiple testcases found in " + file.name + " file.  Please separate/save testcases in Calc Builder. Then reimport");
                console.log(fileContent);
                return false; // exclude this file
            }
            return true; // include this file
        });
    });
}

readFile(file) {
    return new Promise(resolve => {
        console.log("file in promiseFile: " + file.name);
        const fileReader = new FileReader();
        fileReader.onload = () => resolve(fileReader.result);
        fileReader.readAsText(file);
    });
}