HttpClientを使用してAPI呼び出しを行うHTTPサービスがあります。
//provider.service.ts
export interface Lesson {
id?: number,
name: string,
type: LessonType,
teacher_data: string,
student_data: string
}
export class ProviderService {
constructor(private http: HttpClient) {}
postLesson(form): Observable<Lesson> {
const body = this.getFormUrlEncoded(form.value);
return this.http.post<Lesson>('/api/lesson/', body, this.postHttpOptions);
}
}
そして、私はこのProviderServiceを使用するコンポーネントを次のように持っています:
onSubmit():void {
this.providerService.createLesson(lessonForm).subscribe(result=> {
console.log(result);
//do my stuff
});
}
}
それはうまくいきます、すべてが良いです。ここで、LessonServiceを作成して、すべてのhttp呼び出しがそのサービスを通過するようにします。結果をキャッシュしたり、変更を送信したりします。
私はそれをこのように書いた:
//updated lessons.component.ts
onSubmit():void {
this.LessonsService.createLesson(this.lessonForm).subscribe(result=> {
console.log(result);
//do my stuff
});
}
//lessons.service.ts
export class LessonsService {
constructor(private http: ProviderService) {}
@Output() lessonChange: EventEmitter<Lesson> = new EventEmitter();
public createLesson(form): Observable<Lesson> {
let observable = this.http.postLesson(form);
observable.pipe(
map(result => {
//this code is not executed, I do not understand why
this.lessonChange.emit(result);
return result;
})
);
return observable;
}
}
HTTPプロバイダーから結果を取得したときにイベントを発行したい。私が間違っていることは何ですか?
これを行うには2つの方法があります。1つは変数宣言にpipe
を入れる方法と、tap
の代わりにmap
を使用する方法です。
export class LessonsService {
@Output() lessonChange: EventEmitter<Lesson> = new EventEmitter();
public createLesson(form): Observable<Lesson> {
let observable = this.http.postLesson(form).pipe(
tap(result => {
//this code is not executed, I do not understand why
this.lessonChange.emit(result);
return result;
})
);
return observable;
}
}
別の方法は、変数へのサブスクリプションを作成することです
export class LessonsService {
@Output() lessonChange: EventEmitter<Lesson> = new EventEmitter();
public createLesson(form): Observable<Lesson> {
let observable = this.http.postLesson(form);
observable.subscribe(result => {
//this code is not executed, I do not understand why
this.lessonChange.emit(result);
return result;
);
return observable;
}
}
私は個人的に後者を選びます。こうすることで、イベントが成功した場合にのみ発行されるようにすることができます。