Сохранение значения из прослушивателя событий

У меня проблема в том, как я создаю свой код.

Я делаю внешний интерфейс, который обращается к Spotify WebPlaybackSDK для воспроизведения музыки через мой браузер. Способ использования этого — подключиться к sdk из моего внешнего интерфейса, а затем вызвать API из Spotify, который говорит ему воспроизвести песню с устройства, используя токен доступа, идентификатор устройства и идентификатор дорожки.

Моя проблема в том, что у меня нет синхронного способа сохранить идентификатор устройства, который проигрыватель Spotify должен вернуть мне, потому что это делается через прослушиватель событий. Ниже приведен код метода ngOnInit().

(async() => {
        const { Player } = await this.playbackService.loadPlaybackPlayer();
        const sdk = new Player({
          name: "Web Playback SDK",
          volume: 1.0,
          getOAuthToken: callback => { callback(access_token); }
        });
        
        this.playbackService.connectPlayer(sdk);
        sdk.addListener('ready', ({device_id}) => {
          
        })
      })();

У меня есть функция playTrack() внутри моей службы воспроизведения, для которой требуется device_id, но я не знаю, как сохранить ее из прослушивателя событий. Мне нужно сохранить его в своем приложении, чтобы я мог вызывать метод playTrack(), когда захочу.


person John Munar    schedule 30.05.2021    source источник


Ответы (1)


Вы можете создать экземпляр Subject и генерировать его всякий раз, когда срабатывает событие готовности.

Подпишитесь на OnMusicReady и получите device_id.

  device_id;
  OnMusicReady = new Subject();

  ngOnInit() {
    this.OnMusicReady.subscribe(device_id => {
      console.log('Device ID: ' + device_id);
      this.device_id = device_id;
      // Perform additional logic here.
    });
    this.initSpotify();
  }

  initSpotify() {
    (async () => {
      const { Player } = await this.playbackService.loadPlaybackPlayer();
      const sdk = new Player({
        name: 'Web Playback SDK',
        volume: 1.0,
        getOAuthToken: callback => {
          callback(access_token);
        }
      });

      this.playbackService.connectPlayer(sdk);
      sdk.addListener('ready', ({ device_id }) => {
        // Store device_id in the class variable.
        this.OnMusicReady.next(device_id);
      });
    })();
  }
person Sumit Parakh    schedule 30.05.2021
comment
Из-за асинхронности device_id по-прежнему имеет значение null вне функции. Я предполагаю, что это означает, что у меня должен быть способ подождать, пока device_id не перестанет быть нулевым? Это даже лучший способ сделать это? - person John Munar; 30.05.2021
comment
В этом случае лучшим способом сделать это будет использование подписки. Я обновил свой ответ. - person Sumit Parakh; 30.05.2021