Возврат пустого действия или наблюдаемого в действии (угловая редукция / ngrx) - PullRequest
0 голосов
/ 20 ноября 2018

Я загружаю файл на сервер, и я хотел бы отслеживать ход загрузки без спама со многими действиями (для каждого события http).Возможно ли в некоторых случаях вернуть что-то вроде нулевого или пустого наблюдаемого?Потому что я хочу отправить действие только в двух случаях - успех или неудача.И теперь я должен вернуть действие в каждом типе http события, и тогда оно становится спамом.

@Effect()
public createMediaItem: Observable<Action> = this._actions
    .pipe(
        ofType(MediaItemActionTypes.MediaItemCreateAction),
        map((action: MediaItemCreateAction) => action),
        switchMap(action => {
            return this._uploadService.createMediaItem(action.formData)
                .pipe(
                    map((event: HttpEvent<HttpEventType>) => {
                        switch (event.type) {
                            case HttpEventType.UploadProgress: {
                                console.log('ignore');
                                action.fileItem.progress = Math.round(event.loaded / event.total * 100);
                                break;
                                // return;
                            }

                            case HttpEventType.Response: {
                                return new MediaItemCreateSuccessAction();
                            }
                            default:
                                break;
                            // return;
                        }
                    })
                );
        })
    );

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Итак, мое решение ниже.Я решил не отправлять действие прямо из эффекта, поэтому я использую хранилище для отправки действия только тогда, когда мне нужно.

@Effect({ dispatch: false })
public createMediaItem: Observable<void> = this._actions
    .pipe(
        ofType(MediaItemActionTypes.MediaItemCreateAction),
        map((action: MediaItemCreateAction) => action),
        mergeMap(action => {
            return this._uploadService.createMediaItem(action.formData)
                .pipe(
                    map((event: HttpEvent<HttpEventType>) => {
                        switch (event.type) {
                            case HttpEventType.UploadProgress: {
                                action.fileItem.progress = Math.round(event.loaded / event.total * 100);
                                break;
                            }

                            case HttpEventType.Response: {
                                this._store.dispatch(new MediaItemCreateSuccessAction(action.fileItem, event.body));
                                break;
                            }

                            default:
                                break;
                        }
                    }),
                    catchError(error => of(this._store.dispatch(new MediaItemCreateFailAction(action.fileItem, error))))
                );
        })
    );
0 голосов
/ 08 февраля 2019

Единственное решение, которое я нашел, это возвращение NeverObservable ().

Rxjs 5.xx Использование:

import {NeverObservable} from 'rxjs/observable/NeverObservable';
return NeverObservable.create();

NeverObservable просто остановит эффект напрямую, не ожидая возвратаЗаметный

0 голосов
/ 20 ноября 2018

Использовать Rx.Observable.empty:

Чтобы вернуть пустое действие, вы можете использовать empty , наблюдаемый из RxJS .

пусто (планировщик: Планировщик): Observable

Создает Observable, которое не отправляет никакие объекты Наблюдателю и немедленно отправляет полное уведомление.

var result = Rx.Observable.empty();
result.subscribe(x => console.log(x));
...