import { Component } from "@angular/core";
import { Observable, of, throwError, Subscription, forkJoin } from "rxjs";
import { mergeMap, map, delay, timeout, first, take } from "rxjs/operators";
import { ajax } from "rxjs/ajax";
class Test {
id: number;
firstObj: FirstObj;
secondObj: SecondObj;
thirdObj: string;
}
interface FirstObj {
firstObs: boolean;
result: string;
}
interface SecondObj {
secondObs1: boolean;
secondObs2: boolean;
}
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
private workOrderSubscription: Subscription;
name = "Angular";
obsOne: Observable<any> = of("First Obs")
.pipe(delay(6000))
.pipe(
map(res => {
return {
firstObs: true,
result: res
};
})
);
dataTwo: SecondObj = { secondObs1: true, secondObs2: false };
obsTwo: Observable<any> = of(this.dataTwo);
obsThree: Observable<any> = of("error");
private getId(): Observable<any> {
return of("id" as string);
}
public retrieveWork(): Observable<Test> {
const test: Test = new Test();
this.getId().subscribe((id: number) => {
test.id = id as number;
forkJoin(this.obsOne, this.obsTwo, this.obsThree).subscribe(
([first, second, third]: [FirstObj, SecondObj, string]) => {
// some appropriate checks here
test.firstObj = first as FirstObj;
test.secondObj = second as SecondObj;
test.thirdObj = third as string;
console.log("first is " + first.result);
console.log("second is " + second.secondObs1);
console.log("third is " + third);
console.log(`inside ******************** ${JSON.stringify(test)}`);
return of(test);
},
error => {
//error here
console.log("GOT ERROR");
}
);
});
console.log(`returning ******************** ${JSON.stringify(test)}`);
return of(test);
}
ngOnInit() {
console.log("data ************************");
this.retrieveWork()
.pipe(timeout(10000))
.subscribe(data => {
{
console.log("printing data ***************************");
console.log(`${JSON.stringify(data)}`);
}
});
}
ngOnDestroy() {}
}
Я пробовал много способов, в основном то, что я пытаюсь сделать, находится в ngOnInit
Я подписываюсь на get (), но данные, которые я получаю, не полны. Подписка не ждет, пока forkJoin
полностью не вернется. Я не уверен, как я могу получить полные данные.
После того, как первая подписка завершится, она хотела бы, чтобы первая и вторая подписка завершились, а затем заполнили класс 'Test', а затем мой подписчик. в ngOnInit
для получения данных.
Мой вывод выглядит так
data *********************** *
возврат ******************** {"id": "id"}
печать данных ***** **********************
{"id": "id"}
сначала это First Obs
секунда верна
третья ошибка
внутри ******************** {"id": "id" , "firstObj": {"firstObs": true, "result": "First Obs"}, "secondObj": {"secondObs1": true, "secondObs2": false}, "thirdObj": "error"}
Как видно из вышеприведенного вывода, печатается только идентификатор (после 1-й подписки), но после второй подписки подписчик в ngOnInit
больше не получает данные.
Спасибо вы.