了解 rxjs 6 中的合并(特别是 redux-observable)
Understanding merge in rxjs6 (and redux-observable specifically)
上下文:我正在尝试使用 redux-observable
和 rxjs v6
在获取资源后触发多个操作。
问题: 获取资源后可以触发单个动作没问题;但我试图触发多个动作让我难过。具体来说,我在下面显示的使用 rxjs merge
触发多个操作的尝试看起来非常标准并且接近记录的示例 (see e.g. here),以至于我无法理解我哪里出错了。这是我的代码的细分,注释中指出了打字稿类型;为了问题清楚起见,我简化了一些事情:
import { from } from "rxjs";
import { merge, mergeMap, map } from "rxjs/operators";
import { AnyAction } from "redux";
... //Setup related to rxjs-observable epics
function myEpic(
action$: Observable<AnyAction>,
state$: any,
{fetchPromisedStrings}: any
) {
return action$.pipe(
ofType('MY_ACTION'),
mergeMap(
action =>
{
const demoAction1: AnyAction = {type:'FOO1', payload:'BAR1'};
const demoAction2: AnyAction = {type:'FOO2', payload:'BAR2'};
const w = from(fetchPromisedStrings()) //const w: Observable<string[]>
const x = w.pipe( map(() => demoAction1)); //const x: Observable<AnyAction>
const y = w.pipe( map(() => demoAction2)); //const y: Observable<AnyAction>
//My attempt to merge observables:
const z = merge(x,y); // const z: OperatorFunction<{}, {} | AnyAction>
// return x; // Works :)
// return y; // Works :)
return z; // Doesn't work :(
}
)
);
}
当我尝试 return z
:
时,此代码出现以下错误
TypeError: You provided 'function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
那么这里有什么问题呢?我希望上面代码中的 merge
采用两种 Observable<AnyAction>
类型和 return 一种 Observable<AnyAction>
类型(或与 [=18= 兼容的一些更通用的类型) ],我的史诗需要它才能正常运行)。相反,我得到了一些名为 OperatorFunction<{}, {} | AnyAction>
的不透明类型,显然它与 Observable<AnyAction>
不兼容。有人可以在这里澄清我的想法吗? merge
不是我应该在这里使用的运算符,还是我的整个 rxjs-v6
模式对于获取承诺的资源后触发多个操作的(看似)简单目标是错误的?
上下文:我正在尝试使用 redux-observable
和 rxjs v6
在获取资源后触发多个操作。
问题: 获取资源后可以触发单个动作没问题;但我试图触发多个动作让我难过。具体来说,我在下面显示的使用 rxjs merge
触发多个操作的尝试看起来非常标准并且接近记录的示例 (see e.g. here),以至于我无法理解我哪里出错了。这是我的代码的细分,注释中指出了打字稿类型;为了问题清楚起见,我简化了一些事情:
import { from } from "rxjs";
import { merge, mergeMap, map } from "rxjs/operators";
import { AnyAction } from "redux";
... //Setup related to rxjs-observable epics
function myEpic(
action$: Observable<AnyAction>,
state$: any,
{fetchPromisedStrings}: any
) {
return action$.pipe(
ofType('MY_ACTION'),
mergeMap(
action =>
{
const demoAction1: AnyAction = {type:'FOO1', payload:'BAR1'};
const demoAction2: AnyAction = {type:'FOO2', payload:'BAR2'};
const w = from(fetchPromisedStrings()) //const w: Observable<string[]>
const x = w.pipe( map(() => demoAction1)); //const x: Observable<AnyAction>
const y = w.pipe( map(() => demoAction2)); //const y: Observable<AnyAction>
//My attempt to merge observables:
const z = merge(x,y); // const z: OperatorFunction<{}, {} | AnyAction>
// return x; // Works :)
// return y; // Works :)
return z; // Doesn't work :(
}
)
);
}
当我尝试 return z
:
TypeError: You provided 'function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
那么这里有什么问题呢?我希望上面代码中的 merge
采用两种 Observable<AnyAction>
类型和 return 一种 Observable<AnyAction>
类型(或与 [=18= 兼容的一些更通用的类型) ],我的史诗需要它才能正常运行)。相反,我得到了一些名为 OperatorFunction<{}, {} | AnyAction>
的不透明类型,显然它与 Observable<AnyAction>
不兼容。有人可以在这里澄清我的想法吗? merge
不是我应该在这里使用的运算符,还是我的整个 rxjs-v6
模式对于获取承诺的资源后触发多个操作的(看似)简单目标是错误的?