使用 Redux Observable 合并映射后无法传播值

Posted

技术标签:

【中文标题】使用 Redux Observable 合并映射后无法传播值【英文标题】:Cannot propagate a value after mergeMap with Redux Observable 【发布时间】:2021-06-08 22:37:08 【问题描述】:

我有下面非常基本的代码(完全实用),你也可以在这里找到:

https://stackblitz.com/edit/typescript-mergemap-deprecated?file=index.ts

import  merge, of  from "rxjs";
import  mergeMap, map, tap  from "rxjs/operators";

const loadQuestion = () =>
  new Promise(resolve => resolve(
    title: 'How are you?',
    options: [ 'Excellent', 'Good', 'Bad' ],
  ))
;

const action$ = of(
  payload: 
    eventName: 'AskQuestionEvent'
  
);

action$.pipe(
  mergeMap(action => merge(
    of(action).pipe(
      tap(( payload: eventName ) => 
        console.log(eventName);
      ),
      map(( payload:  eventName ) => eventName),
      mergeMap(() => loadQuestion(), (eventName, questionImport) => (
        eventName,
        questionImport
      )),
      map(( eventName, questionImport ) => (
        eventName,
        question: questionImport
      )),
      tap(( eventName, question ) => 
        console.log(eventName);
        console.log(question);
      ),
    ),
  )),
).subscribe();

它按预期工作,但我的问题是内部 mergeMap 似乎已被弃用。

我收到了错误:

@deprecated — resultSelector no longer supported, use inner map instead

如下图所示:

关于如何摆脱该弃用警告的任何想法?

如果可能的话,请在上面 fork 我的StackBlitz 并应用你的方法吗?

提前谢谢你!

【问题讨论】:

【参考方案1】:

要摆脱弃用警告,您需要停止使用resultSelector 参数。

你的代码resultSelector:

mergeMap(() => loadQuestion(), (eventName, questionImport) => (
  eventName,
  questionImport
)),

更新的代码没有:StackBlitz

mergeMap(eventName => from(loadQuestion()).pipe(
  map(questionImport => (eventName, questionImport))
)),

附: - 如果您只是将 questionImport 重命名为 question,则不需要您的第二个 map:StackBlitz #2。

【讨论】:

以上是关于使用 Redux Observable 合并映射后无法传播值的主要内容,如果未能解决你的问题,请参考以下文章

React redux-observable:以史诗般的方式进行顺序 API 调用

下一个使用 cookie 的 js redux-observable 持久认证令牌

如何使用 rxjs 和 redux observable 实现 Promise 类型的场景?

为啥使用 Redux-Observable 而不是 Redux-Saga?

如何在 redux-observable 史诗中链接 RxJS 可观察?

在映射期间对每个自动生成的 observable 进行后处理