У меня есть вызов http.get в моей службе member.service.ts, и я хочу дождаться завершения этого вызова, прежде чем перейти к app.component, поэтому я пытаюсь обернуть вызов http.get в Observable для обработки в app.component.
[Примечание: ранее, до того, как я завернул сервис в Observable, сервис работал нормально. . . вызов http.get сам по себе работает, как и ожидалось, и возвращает объект JSON.]
Но когда я обернул вызов http.get в Observable, как показано ниже, приложение зависло. Я искал в Интернете и читал о flatMap, forkjoin и т. д., но я хотел бы сохранить текущую структуру, где вызов http.get находится в службе member, а весь остальной код — в app.component.
Большое спасибо, если есть идеи, почему он зависает и как это исправить!
member.service.ts
import { Injectable } from '@angular/core';
import { Observable, from, of } from 'rxjs';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class MemberService {
url: string = "http://localhost:3000/sign-up";
data: string = '';
constructor(private http: HttpClient) { }
getMemberForm(): Observable<any> {
let library = this.http.get(this.url,{responseType: 'json'});
library.subscribe((data) => {
this.data = JSON.stringify(data);
});
return of(this.data);
}
}
app.component.ts
import { Component, OnInit, Injectable } from '@angular/core';
import { MemberService } from './member.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
@Injectable()
export class AppComponent implements OnInit {
got_data: boolean = false;
data: string;
constructor(private member: MemberService) {}
ngOnInit() {
this.member.getMemberForm().subscribe((data)=>{
this.data = data;
if (this.data.length > 0) this.got_data = true;
});
}
}





Вы неправильно обрабатываете асинхронный код.
Код Асинхронный — это код, который выполняется вне нормального потока выполнения кода. Код внутри вашего метода subscribe является асинхронным и будет выполняться только при получении ответа на HTTP-вызов.
Измените свой код следующим образом:
getMemberForm(): Observable<any> {
return this.http.get(this.url,{responseType: 'json'})
.pipe(map( res => of(JSON.stringify(res))))
}
Ваше приложение зависает, вероятно, потому, что ваш this.data не определен, и вы пытаетесь изменить undefined на Observable
Никогда не подписывайтесь на службу, это «анти-шаблон» в реактивном программировании (rxjs), просто создайте наблюдаемый (http-вызов) в службе, а затем подпишитесь на свой компонент, чтобы вызвать HTTP-запрос, {responseType: 'json'} не не нужны все «последние» версии (> 4.3) углового http-клиента делают это по умолчанию
interface MyDataType{
data: any;
}
getMemberForm() {
//no need to type the function return beacuse typescript will do it for you
//you can type directly the http call
return this.http.get<MyDataType>(this.url);
}
Спасибо! Это работает (но, как показано ниже, я думаю, что нет необходимости в вызове
of()).