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(文件); } }); }
我只想在readFile方法完全完成后运行submitTC()方法,但是(在submitTCtoDB内部)会被提前调用 我想。那么,还是承诺用得不好 所需的功能是仅当readFile方法完成读取/拼接文件时才调用submitTC方法。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
请提供帮助。您在循环中有一个
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);
});
}