Преобразуйте серии вложенных обещаний в @Effect - PullRequest
0 голосов
/ 28 сентября 2018

Есть ли способ конвертировать набор вложенных асинхронных обещаний в @Effect?

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

Я довольно новичок в rxjs, и похоже, что я могу получить то же действие, что и "Promise ... then" с помощью выхлопной системы, но я не совсем уверен, как это сделать, и по пути фиксирую ошибки.

Моя цель - переместить всю транзакцию (в настоящее время в службе) в ngrx @ Effect.

Ответы [ 3 ]

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

Прежде всего я бы сделал несколько эффектов, каждый из которых отправлял бы новое действие.Это просто более понятно, и вы получаете журнал в redu-devtools.

@Effect()
public makeFirstRequest = this.actions.pipe(
    ofType<InitialAction>(ActionTypes.InitialAction),
    switchMap(action => this.myService.firstRequest(action.param)),
    map(response => new FollowUpAction(response))
);

@Effect()
public makeSecondRequest = this.actions.pipe(
    ofType<FollowUpAction>(ActionTypes.FollowUpAction),
    switchMap(action => this.myService.secondRequest(action.param)),
    map(response => new NextAction(response))
);

// and so on...

Таким образом, он сначала выполняет InitialAction и делает запрос, и, как только запрос завершен, он выполняет * 1005.*.Вы можете передать ответ как параметр следующего действия.Помните, что вам не нужно передавать ответ на следующее действие.Вы можете делать с ответом все, что захотите, и отправлять новое действие с любыми параметрами (или без параметров), которые вам нравятся.

И я не уверен, включено ли это в ваш вопрос, но вам нужны наблюдаемые, а не обещания,Если вы используете обещания, вы можете просто использовать from(myPromise), предоставленный rxjs, чтобы отобразить его в наблюдаемую.

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

Предположим, что a и b являются наблюдаемыми, тогда вы можете подождать, пока все наблюдаемые будут восстановлены, используя метод forkJoin .

Rx.Observable.forkJoin([a,b]).subscribe(result=> {
        var resultA = result[0];
        var resultB = result[1];
});
0 голосов
/ 28 сентября 2018

Я не уверен, что я действительно понимаю вашу проблему, но кажется, что вы могли бы просто использовать Promise.all(), чтобы превратить набор обещаний в одно обещание, которое затем можно было бы использовать в ваших @Effects. См. Определение Promise.all ()

...