可能是我的noob并且还没有完全理解这些东西应该如何工作,但是我在redux-observable中有一个史诗,我想用它作为一种方法来创建一个将发送一个动作的承诺并在解决之前等待不同的操作。我通过将操作映射到'__IGNORE__'
来实现它,但我真的不想这样做。有没有办法让史诗处理一个动作,但不能传递任何其他内容?
这是我的代码:
export const waitFor = (type, action) => new Promise((resolve, reject) => {
const waitForResult = action$ => action$.ofType(type).do(() => resolve()).mapTo({type: "___IGNORE___"});
registerEpic(waitForResult);
action();
});
答案 0 :(得分:9)
您可以使用.ignoreElements()
RxJS运算符
action$.ofType(type)
.do(() => resolve())
.ignoreElements();
另一种方法(不再是对或错)是创建一个只订阅的匿名Observable。
const waitForResultEpic = action$ => new Observable(observer =>
action$.ofType(type)
.subscribe(() => resolve())
);
这隐式返回我们创建的订阅,因此它也附加到rootEpic的生命周期中。因为我们从不打电话给observer.next()
,所以这部史诗永远不会发出任何价值;就像ignoreElements()
。
虽然你没有问,但你最终可能会注意到你的史诗会永远运行,听取与type
变量相匹配的传入动作。如果你想匹配一次然后完成,这可能不是你想要的。
您可以使用.take(1)
运算符完成此操作。
const waitForResult = action$ =>
action$.ofType(type)
.take(1)
.do(() => resolve())
.ignoreElements();
或者
const waitForResult = action$ => new Observable(observer =>
action$.ofType(type)
.take(1)
.subscribe({
next: () => resolve(),
error: err => observer.error(err),
complete: () => observer.complete()
})
);
这只会在应用程序的整个生命周期内匹配一次 - 一旦收到,它将永远不会再次执行。