返回空动作或可观察到的有效值(角度redux / ngrx)

时间:2018-11-20 09:28:59

标签: angular redux ngrx angular7

我正在将文件上传到服务器,并且我希望跟踪上传进度而不会在每个HTTP事件上进行很多操作而不会造成垃圾邮件。在某些情况下是否可以返回可观察到的null或Empty?因为我只想在两种情况下分派动作-成功或失败。现在,我必须以每种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 :(得分:0)

使用Rx.Observable.empty:

要返回空操作,可以使用从 RxJS 观察到的empty

空(计划程序:计划程序):可观察

创建一个Observable,该Observable不会向观察者发出任何项目,并立即发出完整的通知。

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

答案 1 :(得分:0)

因此,我的解决方案如下。我决定不直接从效果上调度动作,因此我只在需要时才使用store来调度动作。

@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))))
                );
        })
    );

答案 2 :(得分:0)

我发现的唯一解决方案是返回一个NeverObservable()。

Rxjs 5.x.x 用法:

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

NeverObservable只会直接停止效果,而不会期望返回Observable