循环运行操作直到成功完成

时间:2018-04-11 13:09:55

标签: redux rxjs redux-observable

我有一个史诗,当用户更新有关他的视频的数据时触发该史诗。用户有一个页面上有多个视频,可以在任何选定的视频上更新标题。在页面底部有提交,当用户点击它时,我需要保存对所有视频的更改,因此我发送操作 saveVideo 。此操作正在触发将发送请求的epic,并且在成功时应触发要保存的列表上的下一个待处理视频。

史诗:

const updateVideoEpic = action$ => 
          action$.ofType(videoTypes.UPDATE_VIDEO_REQUEST)
                 .switchMap(action =>  Observable.from(updateVideo(action.payload)))
                 .takeUntil(action$.ofType(videoTypes.UPDATE_VIDEO_REQUEST_CANCEL))
                 .map(video => videoAction.updateVideoSuccess(video))
                 .catch((error) => Observable.of(videoAction.updateVideoFailure(error)));

如何在成功更新第一个视频的数据后触发异步史诗将再次触发相同的史诗来更新下一个视频的数据。

我想创造另一部史诗,但你如何检查是否一切都过去了。 Sudo代码:

const updateVideos = action$ => 
          action$.ofTypes(videoTypes.UPDATE_VIDEO_BATCH_REQUEST)
                 .switchMap(action => action.payload.videos)
                 .map(video => videoAction.updateVideoBatchRequest(video));

1 个答案:

答案 0 :(得分:0)

我改变了一点方法,并决定只使用fetch和循环请求:

// Import stylesheets
import './style.css';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { from } from 'rxjs/observable/from';
import { mergeMap, catchError, switchMap } from 'rxjs/operators';
import { zip } from 'rxjs/observable/zip';

const urls = [
  { url: 'https://bbc.co.uk', name: 'BBC'},
  { url: 'https://google.com', name: 'Google'},
  { url: 'https://amazon.com', name: 'Amazon'}
];

const items$ = from(urls).pipe(
  mergeMap(item => fetch(item.url, {mode: 'no-cors'}))
)
items$.subscribe(
  url => console.log(url),
  error => console.log(error),
  () => console.log('Complete')
);

工作副本: Working copy on stackblitz