Async / await не работает должным образом внутри функции карты - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь выполнить несколько запросов get внутри функции карты, но я получаю ', обнаружил необработанное отклонение обещания с "TypeError: Невозможно прочитать свойство trackItems' undefined" '.

Функция, представленная ниже, в основном получает ответ в качестве параметра и создает объект для сохранения его содержимого.В конце я получаю свой объект с идентификатором, именем и типом, как и ожидалось, но массив trackItems всегда остается пустым .Я уверен, что то, что я получаю от моей функции getPlaylistTracks, является правильным и не может понять, почему она не работает должным образом.

Кроме того, я использую requestPromiseNative на getPlaylistTracks для выполнения запроса и использованияожидайте, и моя глобальная переменная homeContentItems имеет такой тип структуры:

приватная статическая homeContentItems : любая = {items: [{content: {items: []}}]};

А это функция saveContent:

   private saveContent(homeItemsResponse: any): any {
        try {
          if (homeItemsResponse && homeItemsResponse !== undefined) {
            homeItemsResponse.map((playlistCategoriesItem: any, i: number) => {
              const homeContent: any = Home.homeContentItems.items[0].content.items;

              homeContent.push({ name: playlistCategoriesItem.name, content: { items: [] } });

              const playlistContent: any = playlistCategoriesItem.content.items;

              playlistContent.map(async (playlistItem: any) => {
                const homePlaylistItems: any = Home.homeContentItems.items[0].content.items[i].content.items;

                homePlaylistItems.push({
                  id: playlistItem.id,
                  name: playlistItem.name,
                  type: playlistItem.type,
                  trackItems: [],
                });

                const playlistId: string = playlistItem.id;
                const response: any = await this.getPlaylistTracks(playlistId);

                response.items.map(async (item: any) => {
                  homePlaylistItems.trackItems.push(item);
                });
              });
            });
          }
        } catch (error) {
          this.logger.info(`@@@@ Home - Error on saveHomeContent: ${error}`);
        }
      }

Заранее спасибо:)

1 Ответ

0 голосов
/ 22 ноября 2018

Используйте вместо цикла.Таким образом, await будет работать как положено.

Также не забудьте настроить saveContent функцию async.

private async saveContent(homeItemsResponse: any[]): any {
  try {
    if (homeItemsResponse) {
      let i = 0;

      for (const playlistCategoriesItem: any of homeItemsResponse) {
        const homeContent: any = Home.homeContentItems.items[0].content.items;

        homeContent.push({ name: playlistCategoriesItem.name, content: { items: [] } });

        const playlistContent: any = playlistCategoriesItem.content.items;

        for (const playlistItem: any of playlistContent) {
          const homePlaylistItems: any = Home.homeContentItems.items[0].content.items[i].content.items;

          homePlaylistItems.push({
            id: playlistItem.id,
            name: playlistItem.name,
            type: playlistItem.type,
            trackItems: [],
          });

          const playlistId: string = playlistItem.id;
          const response: any = await this.getPlaylistTracks(playlistId);

          for (const item: any of response.items) {
            homePlaylistItems.trackItems.push(item);
          }
        }

        i++;
      }
    }
  } catch (error) {
    this.logger.info(`@@@@ Home - Error on saveHomeContent: ${error}`);
  }
}
...