angular - 如何取消 ngxs 调度操作

标签 angular typescript ngxs

如何取消正在运行的 store.dispatch(xxx)行动,这样底层的http请求也被取消了吗?

我试过 .unsubscribe()来自 store.dispatch(new FetchSomeStuffOverHttp())调用并期望底层的http请求也被取消。

但它会继续运行,即使 httpClient的 observable 由操作返​​回:

@Action(FetchStuffOverHttp)
fetchStuffOverHttp({ patchState }: StateContext<AuftragStateModel>) {
  return this.httpClient.get(...)
                        .pipe(
                            tap((...) => {  patchState(...) })
                         )
}
store.dispatch(xxx).subscribe().unsubscribe() 是预期的行为吗?不是取消订阅/取消 httpClient可以观察到吗?

相比之下,{ cancelUncompleted: true }选项将取消下层 http 请求。

最佳答案

问:如何取消正在运行的 store.dispatch(xxx) Action ,从而使底层的 http 请求也被取消?

A: 如果底层的 http 请求在 Action 返回的可观察链中(即异步 Action ),那么使用 { cancelUncompleted: true } 调度相同的 Action 如果它仍在运行,将取消先前的调度操作。

如果您想取消正在运行的异步操作而不再次分派(dispatch)给它,您将不得不自己从操作的 observable 处理它(例如,使用适当的 rxjs 模式,如 takeUntil() 运算符)。

问:store.dispatch(xxx).subscribe().unsubscribe() 不是取消订阅/取消 httpClients observable 是预期的行为吗?

答:是的。 AFAIK,这是设计和预期的行为。

关于angular - 如何取消 ngxs 调度操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990332/

相关文章:

javascript - ts-诗乃 : Property 'returns' does not exist on type

Ngxs - 如何在应用程序加载时预填充状态

typescript - 如何递归获取嵌套对象的所有键?

angular - NGXS - 良好实践 : Passing service required params in action or getting it from state?

angular - 将 NGXS 状态分解为更小的可维护部分,但又保持它们彼此可访问的最佳方法是什么?

angular - 错误在 "path"找不到模块 : Error: Can't resolve - Angular 6 Webpack

angular - 如果用户取消对话框,则重置 Md-Slide-Toggle

angular - 使用 WebPack 在 Web Worker 中运行 Angular 2 应用程序

angular - 错误 : Initializers are not allowed in ambient contexts

html - 我需要对 Angular 表单进行验证