#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...
});
}