Как использовать asyn c с ответом http - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь загрузить данные в таблицу на моем веб-интерфейсе, но данные, которые мне нужно предоставить, поступают из API, который я вызываю и сохраняю в массиве, например:

ngOnInit() {
    this.jsonStored = [];
    const observables = this.data.map(data =>
      this.time.getPunchDataWeek(data.id)
    );
    forkJoin(observables).subscribe(
      results => {
        this.jsonStored.push(results);
      },
      err => {
        console.error(err);
      },
      () => {
        this.totalToday = this.time.getTotalEmpToday(this.jsonStored[0][0]);
        this.totalWeek = this.time.getTotalEmpWeek(this.jsonStored[0][0]);
      }
    );
  }

Я знаю, что это происходит асинхронно, поэтому мне нужно дождаться завершения запроса, чтобы передать мой массив jsonStored в другие функции для обработки данных и загрузки их в мою таблицу на внешнем интерфейсе. Я полагаю, что должен сделать это с помощью asyn c -wait, но я не уверен, правильно ли я это делаю.

Я только начинаю писать свой код, но после тестирования я получаю эту ошибку

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'length' of undefined

Пока это мой код

async getTotalData(data: any) {
    await data;
    let i: string | number;
    for (i in data.length) { // <----------------- ERROR REFERS TO THIS LINE
      console.log(i);
      console.log(data[i]);
    }
    return 0;
  }
async getActual(day: string | number | Date) {
    day = new Date(day);

    let response = await this.time.getTotalData(this.jsonStored[0]);
    return 0;
  }
async ngOnInit() {
    for (this.i in this.dash.weekdays) {
      this.SHIFTSTATS_DATA.push({
        day: this.dash.weekdays[this.i],
        requested: 2,
        provided: 2,
        ontime: 2,
        actual: await this.dash.getActual(new Date())
      });
    }
  }

1 Ответ

1 голос
/ 26 февраля 2020

Вам нужно иметь обещание, чтобы работать с async / await.

async getTotalData(data: Promise<any[]>) { // <- Data needs to be a promise

    // assuming that data is a promise and resolve an array, you have to store
    // the result. In this case, I store the result in myArrayResolved
    const myArrayResolved: any[] = await data;

    let i: string | number;

    for (i in myArrayResolved.length) { // <- now I do my array stuff
      console.log(i);
      console.log(data[i]);
    }
    return 0;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...