javascript - pozvati then tek nakon što metoda koja vraća obećanje završi
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);
}
});
}
Želim pokrenuti metodu submitTC() tek nakon što metoda readFile potpuno završi, ali .then(unutar submitTCtoDB) se poziva prerano.
Mislim da .then ili promise nije pravilno korišten.
Željena funkcionalnost je pozvati metodu submitTC samo kada metoda readFile završi čitanje/spajanje datoteka. Molim vas za pomoć.
Odgovor #1
Imate resolve poziv u petlji, ali resolve ima učinak samo kada se pozove prvi put: kada se obećanje ispuni, to je njegovo konačno stanje, i then povratni pozivi se izvršavaju. Dakle, to se događa kada je prva datoteka pročitana, bez čekanja da se obradi bilo koja druga datoteka.
Što biste mogli učiniti:
- Pretvorite
FileReaderu obećanje bez dodavanja specifične logike (vašeifprovjere): ostavite to izvan njega, kako bi ostalo generički - Koristite
Promise.allza mapiranje popisa datoteka u novi promise koji će vratiti popis sadržaja datoteka. - Obradite popis sadržaja za specifične provjere
- Vrati novi obećanje (
Promise.allili onaj koji je na njega vezan) pozivatelju.
Kod :
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);
});
}
