我正在将文件上传到服务器,并且我希望跟踪上传进度而不会在每个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;
}
})
);
})
);
答案 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