Angular Rx Js - Получение подписчика вместо требуемого значения - PullRequest
0 голосов
/ 29 февраля 2020

Прежде чем получать текущие заказы клиентов, мне нужно вернуть его имя, поэтому моя связанная часть класса обслуживания выглядит следующим образом:

Обновлено:

export class AuthService {

      customerNameUrl = 'customers/name/' + name;
      . . . 
      getCustomerOrders(customerName: string): Observable<CustomerOrder[]> {
          let currentCustomerName = this.getCurrentCustomer(customerName).subscribe(customer => customer.name);
          console.log(currentCustomerName);     <--- Error
          let customerOrders =  this.http.get<CustomerOrder[]>(this.customerOrdersUrl);
          console.log(customerOrders);
          return customerOrders
      }

      getCurrentCustomer(name: string): Observable<Customer> {
        const url = this.customerNameUrl;
        return this.http.get<Customer>(url).pipe(
          tap(_ => this.log(`fetched customer name=${name}`, 'success')),
          catchError(this.handleError<Customer>(`getCustomer name=${name}`))
        );
      }
      . . .
}

Но первый console.log показывает подписчиков вместо требуемого значения. Я пытался добавить оператор карты, чтобы получить только имя от объекта, но не получилось, может быть, он был добавлен неверно, любая идея?

1 Ответ

5 голосов
/ 29 февраля 2020

Метод subscribe возвращает Subscriber. Это имеет смысл правильно? Все Observable и JS по своей природе в основном асин c. Вы извлекаете данные asyn c, вам нужно как-то дождаться их и использовать обратный вызов для продолжения с возвращенными данными. См. здесь для основного потока об этом.

В вашем случае это будет означать, что вам придется использовать что-то для создания цепочки Observables. Хорошо, что есть куча операторов, мы должны их использовать. В этом случае лучшим оператором будет mergeMap или concatMap. Однако мне неясно, зачем вам нужно имя клиента, поскольку вы не передаете его в API клиента get. Тем не менее, это решает ваш запрос?

getCustomerOrders(customerName: string): Observable<CustomerOrder[]> {
  return this.getCurrentCustomer(customerName).pipe(
    // here you have your customer object, but what do you want to do with it?
    mergeMap((customer) => this.http.get<CustomerOrder[]>(this.customerOrdersUrl))
  );
}

getCurrentCustomer(name: string): Observable<Customer> {
  const url = this.customerNameUrl;

  return this.http.get<Customer>(url).pipe(
    tap(_ => this.log(`fetched customer name=${name}`, 'success')),
    catchError(this.handleError<Customer>(`getCustomer name=${name}`))
  );
}
...