Проблема с MergeMap с forkJoin Angular 5
Я пытаюсь выполнить 5 параллельных HTTP-запросов с mergeMap и forkJoin условно. Для меня только первый API выполняется, а остальные API не запускаются.
моя функция выполнит первый API, и если он вернет статус "NOT_FOUND", то мне нужно выполнить еще 5 API и вернуть конечный результат. Если Iam получает статус, отличный от NOT_FOUND, нужно просто вернуть наблюдаемое из первого http-запроса. Я пробовал разные варианты, но, похоже, ничего не работает. Ниже общего кода я получаю "ОШИБКА TypeError: Невозможно получить свойство 'map' с неопределенной или нулевой ссылкой"
public myPostWrapper( url, body, flag): Observable<any> {
return this.http.post( url, body, { headers: this.headers } )
.map(( out: any ) => {
console.log( 'out', JSON.stringify( out ) );
this.result = out;
} )
.mergeMap(( response: any ) => {
console.log( 'response-inside', JSON.stringify( response ) );
if ( this.result.status === 'NOT_FOUND' ) {
return Observable.forkJoin(
response.map(( resp: any ) => {
return this.http.post(url, body, { headers: this.headers })
.map(( res: any ) => {
const section: any = res;
return section;
} );
} ),
response.map(( resp: any ) => {
return this.http.post(url, body, { headers: this.headers })
.map(( res: any ) => {
const section: any = res;
return section;
} );
} )
);
} else {
return Observable.of( this.result );
}
} )
.catch(( error: any ) => Observable.throw( error || 'Server error' )
);
}
Любая помощь / направление будет с благодарностью. Обратите внимание, что я использую Rxjs 5.52 с Angular 5
1 ответ
Во-первых map
где вы устанавливаете this.result
Вы ничего не возвращаете. Это означает, что следующие части цепи будут работать на undefined
, добавлять return out;
к первому map
операция, которая должна решить вашу проблему.
...
return this.http.post( url, body, { headers: this.headers } )
.map(( out: any ) => {
console.log( 'out', JSON.stringify( out ) );
this.result = out;
return out; // <--- This return here
} )
...
По желанию вы должны заменить все вхождения response
в вашем mergeMap
с this.result
,