Как использовать ForkJoin для последовательности http-запросов Angular 4 - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть функция, которая выполняет два http-вызова, ввод второго http зависит от первого http-ответа, и мне нужно, чтобы оба результата были возвращены одновременно.У меня есть код ниже, который выдает ошибку

SomeMethod(): Observable<any> {
    let firstResult;
    let secondResult;

    firstResult = http.get('////').map(data => {
        console.log('first response')
     secondResult = http.get('//// + {data.UserId}').map(response => {

        console.log('second response')
     })
    })

    return forkJoin([firstResult, secondResult]);
}

CallingMethod() {
    this.SomeMethod.subscribe(([firstResult, secondResult]) =>{
     /// Some logic
    })}

Получение ошибки как неопределено.Ожидаемый наблюдаемый, обещание или массив.После того, как отладка узнала, что первый вывод консоли печатается, второй вызов http никогда не выполняется и ответ никогда не виден.

Как вернуть ответы двух вложенных вызовов вместе, используя forkJoin или любой другой механизм?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

forkJoin принимает аргументы inline, а не как массив (если только это не изменение в rxjs между последним и тем, что было упаковано в Angular v4)

const req1 = this.http.get('https://jsonplaceholder.typicode.com/todos/1');
const req2 = this.http.get('https://jsonplaceholder.typicode.com/todos/2');

const results = forkJoin(req1, req2)

Вывод:

[
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  {
    "userId": 1,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": false
  }
]

StackBlitz в v6, но его достаточно легко отследить при необходимости.

0 голосов
/ 24 сентября 2018

Используйте Async & await для управления несколькими HTTP-запросами.

async SomeMethod(): Promise <any> {

    let firstResult;
    let secondResult;
    firstResult = await http.get('////').toPromise();
    secondResult = await http.get('//// + {res1.UserId}').toPromise();

    return forkJoin(firstResult, secondResult);
}

 CallingMethod() {
    this.SomeMethod().then(result => {
       /// Some logic
    });
 }
0 голосов
/ 24 сентября 2018

Следующий код должен работать:

SomeMethod(): Observable < any > {
  let firstResult;
  let secondResult;

  return http.get('////').pipe(
    switchMap(res1 => http.get('//// + {res1.UserId}').pipe(
      map(res2 => [res1, res2])
    ))
  );
}

CallingMethod() {
  this.SomeMethod().subscribe(([firstResult, secondResult]) => {
    /// Some logic
  })
}
...