Mengembalikan nilai Observable yang dimodifikasi Angular 6

Perhatikan contoh berikut:

 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 => {

    });


  }

Di sini yang ingin saya capai adalah merangkum data yang diterima dari httpClient dan mengembalikannya, tetapi ini dilakukan setelah eksekusi httpClient selesai. Kompiler memberi tahu saya bahwa "fungsi yang tipe yang dideklarasikan bukan 'void' atau 'any' harus mengembalikan nilai" dan memang demikian. Pertanyaan saya adalah, bagaimana cara mengatasi masalah seperti itu ketika observasi induk harus menunggu observasi httpClient.post() menyelesaikan tugasnya?


person astralmaster    schedule 05.10.2018    source sumber
comment
Sudahkah Anda mencoba meletakkan return sebelum this.httpClient.post... dan berlangganan login ?   -  person Jacopo Sciampi    schedule 05.10.2018
comment
Ya itu akan berhasil tetapi masalahnya, saya ingin melakukan pekerjaan merangkum data yang diterima ini dalam fungsi login dan kemudian mengembalikannya.   -  person astralmaster    schedule 05.10.2018


Jawaban (1)


Gunakan operator peta untuk mengubah nilai yang dikembalikan oleh 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
Ya, saya sendiri baru saja membaca deskripsi operator peta. Ini adalah cara yang benar untuk mencapai tujuan saya. Terima kasih. - person astralmaster; 05.10.2018
comment
Namun, ini tidak menghilangkan kesalahan. Fungsi yang tipe yang dideklarasikan bukan 'void' atau 'any' harus mengembalikan nilai - person astralmaster; 05.10.2018
comment
Maaf, saya lupa return Observable. Saya melakukan koreksi. Saya berasumsi bahwa data kompatibel dengan tipe kelas Credentials (Anda mungkin harus memberikan nilainya). - person ConnorsFan; 05.10.2018