首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用redux-observable实现背压

使用redux-observable实现背压
EN

Stack Overflow用户
提问于 2020-06-22 20:25:54
回答 1查看 118关注 0票数 1

我正在尝试在我的react应用程序中实现反压逻辑。我发现了一篇关于这个here的很好的帖子,并试图将它添加到我的应用程序中。现在我有了一些代码:

代码语言:javascript
复制
// epic.ts
import { ofType } from 'redux-observable';
import { mapTo, tap, delay, switchMap } from 'rxjs/operators';
import { createIteratorSubject } from './createIteratorSubject';

// fake generator which in real application is supposed to pull data from a server
function* generator() {
  yield 1;
  yield 2;
  yield Promise.resolve(3);
  yield Promise.resolve(4);
  yield 5;
}

const iterator$ = createIteratorSubject(generator());

export function epic(action$: any): any {
  return action$.pipe(
    ofType('TAKE'),
    switchMap(() => {
      return iterator$
        .pipe(
          tap((value) => console.info('INCOMING VALUE', value)),
          delay(1000), // Some hard calculations here
          tap((value) => console.info('DONE PROCESSING VALUE', value))
        )
        .subscribe({
          next: iterator$.push,
          complete: () => {
            console.info('DONE PROCESSING ALL VALUES');
          },
        });
    }),
    mapTo((value: number) => {
      return { type: 'PUT', payload: value };
    })
  );
}
代码语言:javascript
复制
// createIteratorSubject.ts
import { BehaviorSubject } from 'rxjs';

export function createIteratorSubject(iterator: any) {
  const iterator$ = new BehaviorSubject();

  const pushNextValue = async ({ done, value }: any) => {
    if (done && value === undefined) {
      iterator$.complete();
    } else {
      iterator$.next(await value);
    }
  };

  iterator$.push = (value: any) => {
    return pushNextValue(iterator.next(value));
  };

  iterator$.push();

  return iterator$;
}

我面临的问题是我不知道如何将结果值分派给redux。现在我有了下面的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-22 22:03:40

您将在需要ObservableInputswitchMap中返回订阅。您可以像这样更改您的代码以使其正常工作:

代码语言:javascript
复制
export function epic(action$: any): any {
  return action$.pipe(
    ofType('TAKE'),
    switchMap(() => {
      return iterator$
        .pipe(
          tap((value) => console.info('INCOMING VALUE', value)),
          delay(1000), // Some hard calculations here
          tap((value) => console.info('DONE PROCESSING VALUE', value)),
          tap({
            next: iterator$.push,
            complete: () => {
              console.info('DONE PROCESSING ALL VALUES');
            }
          })
        );
    }),
    map((value: number) => {
      return { type: 'PUT', payload: value };
    })
  );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62514434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档