Как вернуть второе значение в шаблоне «вложенная подписка»?

#angular #subscribe

#angular #Подписка

Вопрос:

В приложении Angular 7 у меня есть метод, являющийся частью сервиса, который должен возвращать Observable , чтобы, в свою очередь, быть подписанным некоторым клиентским кодом.

Этот метод построен на шаблоне «вложенные подписки», кстати, я читал, что это своего рода антишаблон. Но, честно говоря, я недостаточно разбираюсь в Angular, чтобы заменить его.

Код выглядит примерно следующим образом:

 public signIn(customer): Observable<Customer> {
        return this.apiProvider.getCustomerTokens(customer)
            .pipe(map(token => {
                return this.apiProvider.getCustomer(token)
                    .subscribe(customerData => {
                        // some code here...
                    });
            }));
    }
  

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

Есть идеи о том, как заставить это работать должным образом?

Спасибо

Ответ №1:

Используйте switchMap.

 public signIn(customer): Observable<Customer> {
        return this.apiProvider.getCustomerTokens(customer)
            .pipe(switchMap(token => this.apiProvider.getCustomer(token))
    }
  

Затем подпишитесь на возвращаемый observable.

Ответ №2:

Вы можете попробовать ниже, используя switchmap, дождаться первого ответа, а затем выполнить другой

 public signIn(customer): Observable<Customer> {
        return this.apiProvider.getCustomerTokens(customer)
            .switchMap(token => {
                return this.apiProvider.getCustomer(token); 
            }).subscribe(customerData => {
                        // some code here...
                    });
    }