javascript - 仅在方法返回承诺完成后调用 then
问题描述
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);
}
});
}
我只想在 readFile 方法完全完成但 .then(inside submitTCtoDB) 被提前调用后才运行 submitTC() 方法。
我认为 .then 或 promise 使用不当。
所需的功能是仅在 readFile 方法完成读取/拼接文件时调用 submitTC 方法。请帮忙。
解决方案
你有resolve
一个循环调用,但resolve
只有在第一次调用时才会产生效果:一旦一个 promise 解决,即是它的最终状态,并且then
回调被触发。所以当第一个文件被读取时就会发生这种情况,而无需等待任何其他文件被处理。
你可以做什么:
- 承诺
FileReader
不添加特定逻辑(您的if
检查):将其保留在外部,因此它仍然是通用的 - 用于
Promise.all
将文件列表映射到将提供文件内容列表的新承诺。 - 处理特定检查的内容列表
- 将新的承诺(
Promise.all
或链接在其上的承诺)返回给调用者。
代码:
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);
});
}
推荐阅读
- javascript - 在 AngularJS 中使用 $scope 更新 ChartJs 图表
- angular - “承诺”类型上不存在属性“订阅”
' @ionic-native/background-geolocation 插件中的错误 - java - 直到第二次单击选项卡时,Android 片段才会加载数据
- javascript - 如何在 Angular 中添加 Swarmify 视频播放器插件 JS 文件?
- r - 创建附加循环 Dplyr
- c# - 在 Windows Server 2012 R2 上加载 asp-net 核心中的客户端证书失败
- c - 生成唯一随机数数组
- c++ - 计算填满国际象棋 64 格所需的总米数
- c# - Azure 参数函数的创建和请求数组
- javascript - 在 ckeditor 5 中设置默认配置字体