redux-observable 不发送任何新动作的史诗
redux-observable epic that doesn't send any new actions
可能是因为我是一个菜鸟,还没有完全理解这些东西应该如何工作,但我在 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();
});
您可以使用 .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()
})
);
这在应用程序的整个生命周期内只会匹配一次——一旦收到,就再也不会匹配了。
可能是因为我是一个菜鸟,还没有完全理解这些东西应该如何工作,但我在 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();
});
您可以使用 .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()
})
);
这在应用程序的整个生命周期内只会匹配一次——一旦收到,就再也不会匹配了。