Angular2 - Как цепь запросов HTTP асинхронных и остановится, если не удается

Обновить

December 2018

Просмотры

507 раз

3

У меня есть массив HTTP запросов, которые я должен стрелять в определенном порядке, но если какой-либо из предыдущего не работает, то ни один из следующих из них не будет выполняться.

  1. Как я могу добиться этого?

  2. Какой самый лучший подход?

Мне нужно что-то вроде:

  let failed: boolean = false;
  payloadArray.forEach(payload => {
     if (!failed) {
     http.post(this.url, payload, this.options)
     .map((res: Response) => {
        return res.json;
      })
    .catch((error: any) => {
          failed = true;
          Observable.throw(error.json().error || 'Server error')
       });
     }
  }

2 ответы

-1

если вы хотите отправить несколько запросов HTTP, используйте ForkJoin. а для вас вопрос модуль Http обрабатывает как успех и ошибки в ответе

let failed: boolean = false;
let sampleArr = [];

payloadArray.forEach(payload => {
    if (!failed) {
        sampleArr.push(this.http.post(this.url, payload, this.options))
    }
})

Observable.forkJoin(sampleArr).subscribe(
    (data) => this.data = data, 
    (err) => Observable.throw(err.json().error || 'Server error')

); 
3

Это потребует Observable создателя, который слился излучаемое значение, но только подписался последовательно после каждого завершения. Я не думаю, что есть что-то подобное, что в библиотеке RxJs.

Я написал фабричный метод, который я думаю, что дало бы то, что вы хотите:

public sequence(requests: Array<Observable<Response>>): Observable<Response[]> {
    return Observable.create((observer) => {
        const output = [];

        function executeHttp() {
            const request = requests.pop();
            if (request) {
                request.take(1).subscribe((value) => {
                    output.push(value);
                    executeHttp();
                }, (ex) => {
                    observer.error(ex);
                });
            } else {
                observer.next(output);
                observer.complete();
            }
        }

        executeHttp();
    });
}

Обратите внимание , что я добавил take(1)оператор к HTTP наблюдаемым. Это было сделано , чтобы иметь HTTP наблюдаемые уничтоженные после получения ответа. Так что вам не придется звонить отказаться от подписки. Вы можете использовать take(1)или first()которые делают то же самое, но они работают по- другому , когда нет ничего излучается.

Если вы нашли оператор, которые делают то, что вы хотите. Пожалуйста, дайте мне знать.