Наблюдаемый - преобразование 2 обещаний в наблюдаемое

У меня есть популярный сценарий, когда мне нужно создать одно обещание, которое возвращает данные, которые передаются второму обещанию. Если первое обещание не выполняется, мне нужно отменить второе обещание. На земле "Обещание" это будет выглядеть примерно так:

Fn1.doPromise( initialData )
  .then(info => {
        Fn2.doPromise( info )
              .then(result => {
                  //success - return result
              })
              .catch(error => {
                //error
              });
  })
.catch(error => {
  //cancel 2nd promise and show error
});

Теперь я пытаюсь изучить лучший способ сделать это, используя Observables с чем-то вроде RxJS. Кто-нибудь может дать мне хорошее решение? Заранее спасибо!

2 ответа

Общая проблема обработки ошибок с RxJS рассматривается здесь. Основные моменты:

  • Ловить ошибки (с catch оператор, либо на уровне экземпляра, либо на уровне класса)
  • Игнорирование ошибок с onErrorResumeNext
  • Повторяющиеся последовательности (с retry)
  • Обеспечение очистки (с finally)
  • Обеспечение утилизации ресурсов (с finally или же using)
  • Задержка ошибок (с mergeDelayError)

О вашем конкретном вопросе вы можете использовать Rx.Observable.fromPromise превратить обещание в наблюдаемое; Rx.Observable.prototype.catch для перехвата ошибок по мере их возникновения.

Rx.Observable.fromPromise(Fn1.doPromise( initialData ))
  .flatMap(info => {
        return Rx.Observable.fromPromise(Fn2.doPromise( info ))
              .flatMap(result => {
                  //success - return result
                  // !! You must return an observable or a promise here !!
              })
              .catch(error => {
                //error
                // !! You must return an observable here !!
              });
  })
.catch(error => {
  //cancel 2nd promise and show error
  // !! You must return an observable here !!
});

Примеры:

Я также смог найти хорошее общее решение для моего обещания "цепочки" после проведения дополнительных исследований. С этим я могу использовать много обещаний, сколько мне нужно.

const flatMapAll = (...fns) =>
   fns.reduce((acc, fn) =>
   acc.flatMap(fn), Rx.Observable.just())



flatMapAll( p1 ,p2 ,p3).subscribe();
Другие вопросы по тегам