Как я могу заполнить атрибут в angular внутри подписки с помощью подписки?

# #angular #typescript #firebase #google-cloud-firestore

#угловой #машинописный текст #огневая база #google-облако-firestore

Вопрос:

Если вопрос не ясен, позвольте мне объяснить ситуацию как можно лучше.

У меня есть следующий код:

 initFunc(appUser: AppUser) { (this.userkey = appUser.email),  (this.username = appUser.name),  (this.subscription = this.musicService  .getAll()  .valueChanges({  idField: 'key',  })  .subscribe((music: any) =gt; {  this.filteredMusic = this.music = music.map((music: any) =gt; {  return {  songname: music['songname'],  genre: music['genre'],  artistkey: music['artistkey'],  artist: music['artist'],  key: music['key'],  inplaylist: this.rode(music['key'], this.userkey),  };  });  this.dataSource = new MatTableDataSourcelt;Musicgt;(this.filteredMusic);  this.initPaginatorAndSort();  })); }  

Этот код получает все музыкальные данные и помещает их в список музыки. В возврате я определяю атрибуты, и это работает, за исключением inplaylist атрибута.

Этот атрибут должен быть заполнен на основе другой таблицы. У меня есть таблица для списков воспроизведения, которая содержит музыку. Когда вы войдете в систему, вы сможете добавлять песни в свой плейлист в таблице. Все это работает, но я не могу add to collection отключить кнопку после добавления песни, так как мне нужно проверить, есть ли песня уже в списке воспроизведения.

за rode это отвечает метод. Он берет ключ песни в таблице и текущего пользователя. Этот метод выглядит следующим образом:

 rode(songId: string, userId: string): any { this.subscription2 = this.playlistService  .getAllByStatus(userId, songId)  .get()  .subscribe((result: any) =gt; {  console.log(result.size   ' : '   userId   ' - '   songId);  if (result.size lt;= 0) return false;  return true;  }); }  

Этот метод вызывает метод в playlistService . Он будет искать в списке воспроизведения вошедшего в систему пользователя и получать результаты, если идентификатор песни совпадает. Если результат не содержит каких-либо элементов, он вернет значение false, в противном случае он вернет значение true. Я могу добавить это логическое значение в свои данные, чтобы включить/отключить add to collection кнопку в таблице.

Когда я запускаю код, inplaylist атрибут заполняется неправильно. Сначала я подумал, что это потому, что запрос был неправильным, но это было не так. Журнал консоли, который вы можете видеть в rode методе, регистрирует все правильно для каждого элемента в таблице.

Я думаю, что это как-то связано с тем фактом, что rode метод выполняется после initFunc того, как он уже завершен. Когда я регистрирую что-то в initFunc методе, оно всегда отображается первым в консоли.

Я не знаю, как я могу заставить это работать. Я не могу завернуть метод initFunc внутрь rode , так rode как метод зависит от атрибута идентификатора песни.

Если есть другие способы сделать это, дайте мне знать. Дайте мне знать, если вам понадобится дополнительная информация.

Комментарии:

1. Если вы используете функцию async-await для rode, это будет полезно.