Возврат измененного наблюдаемого значения Angular 6

Рассмотрим следующий пример:

 login(context: LoginContext): Observable<Credentials> {

    let credentials = JSON.stringify(context);

    this.httpClient.post("http://localhost:64636/api/Account/login", credentials, {
      headers: new HttpHeaders({
        "Content-Type": "application/json"
      })
    }).subscribe(response => {
      let token = (<any>response).token;

      const data = {
        username: context.username,
        token: token
      };

      this.setCredentials(data, context.remember);
      return of(data);

    }, err => {

    });


  }

Здесь то, чего я пытаюсь добиться, - это инкапсулировать данные, полученные от httpClient, и вернуть их, но это делается после завершения выполнения httpClient. Компилятор говорит мне, что «функция, объявленный тип которой не является ни «пустым», ни «любым», должна возвращать значение», и это правильно. Мой вопрос: как решить такую ​​​​проблему, когда родительский наблюдаемый должен ждать, пока наблюдаемый httpClient.post() завершит свою задачу?


person astralmaster    schedule 05.10.2018    source источник
comment
Вы пробовали поставить return перед this.httpClient.post... и подписаться на login?   -  person Jacopo Sciampi    schedule 05.10.2018
comment
Да, это сработает, но дело в том, что я хочу выполнить работу по инкапсуляции полученных данных в функцию входа в систему, а затем вернуть их.   -  person astralmaster    schedule 05.10.2018


Ответы (1)


Используйте оператор карты, чтобы изменить значение, возвращаемое Observable:

login(context: LoginContext): Observable<Credentials> {

  let credentials = JSON.stringify(context);

  return this.httpClient.post("http://localhost:64636/api/Account/login", credentials, {
    headers: new HttpHeaders({
      "Content-Type": "application/json"
    })
  }).pipe(
    map(response => {
      let token = (<any>response).token;
      const data = {
        username: context.username,
        token: token
      };
      this.setCredentials(data, context.remember);
      return data;
    })
  );
}
person ConnorsFan    schedule 05.10.2018
comment
Да, я только что прочитал описание оператора карты. Это правильный путь к достижению моей цели. Спасибо. - person astralmaster; 05.10.2018
comment
Однако это не избавляет от ошибки: функция, объявленный тип которой не является ни «пустым», ни «любым», должна возвращать значение. - person astralmaster; 05.10.2018
comment
Извините, я забыл return Observable. Я сделал поправку. Я предполагаю, что data совместим с типом класса Credentials (возможно, вам придется привести значение). - person ConnorsFan; 05.10.2018