вызовите только после того, как метод, возвращающий обещание, будет завершен - PullRequest
0 голосов
/ 03 марта 2019
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);
    }
  });
}

Я хочу запустить метод submitTC () только после того, как метод readFile будет полностью завершен, но .then (внутри submitTCtoDB) вызывается рано.

Я думаю, что .then или обещание не используетсяправильно.

Желаемая функциональность - вызывать метод submitTC только после завершения чтения / объединения файлов методом readFile.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 03 марта 2019

У вас есть вызов resolve в цикле, но resolve имеет эффект только при первом вызове: после разрешения обещания это его окончательное состояние, и запускаются обратные вызовы then.Так происходит, когда файл first прочитан, не ожидая обработки других файлов.

Что вы можете сделать:

  • Обещание 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);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...