当一个动作被派发时做某事

Posted

技术标签:

【中文标题】当一个动作被派发时做某事【英文标题】:Do something when an action has been dispatched 【发布时间】:2019-02-27 01:40:54 【问题描述】:

假设我们有一个动作SyncUserData,它返回监听数据库变化的可观察对象。每当有更改时,该操作都会调度操作new PatchUserData(newData)

SyncUserData 操作从状态的ngxsOnInit 调度(仅一次)。

在不同的部分(例如,组件)中,每当操作 PatchUserData 正在调度时,我都想做一些事情。像这样的:

this.store.onDispatch(PatchUserData).subscribe();

我在源代码中查找了一下,但没有找到与我的示例类似的内容。

【问题讨论】:

【参考方案1】:

直接订阅状态的另一种方法是使用 NGXS 操作流在特定操作已分派/完成时收到通知,请参阅action handlers 的文档。

来自官方文档:

@Component( ... )
export class CartComponent 
  constructor(private actions$: Actions) 

  ngOnInit() 
    this.actions$.pipe(ofActionSuccessful(CartDelete)).subscribe(() => alert('Item deleted'));
  

【讨论】:

你是对的。发布此问题后,我使用了这种方法。这似乎更方便。 是的,我现在也使用了很多次 - 特别是如果我想做某事但并不真正关心查看当前状态时 @EliyaCohen 这似乎是对这个问题的回答 我们如何使用它来检查一个动作的完成情况?【参考方案2】:

在您的情况下,您不需要订阅某个事件,您可以在您的商店中订阅 userData 并拥有它的最新版本,无论任何操作更改它。根据您的数据模型修改下一个示例并订阅 observable:

import  Select  from '@ngxs/store';

@Select(( userData : AppState) => userData)
  userData$!: Observable<UserData>;

更多选择:https://ngxs.gitbook.io/ngxs/concepts/select

【讨论】:

@Select( userData : AppState) =&gt; userData) 是否等于 @Select(state =&gt; state.app.userData) 不,它等于@Select(state =&gt; state.userData) 好的,谢谢,但如果是这样,那你为什么不输入@Select(state =&gt; state.userData)呢? 用什么更适合你,我就是喜欢那种风格

以上是关于当一个动作被派发时做某事的主要内容,如果未能解决你的问题,请参考以下文章

当计算机进入“睡眠”状态时做某事

当 AVQueuePlayer 完成最后一个播放项时如何做某事

取消 Python 脚本时做某事[重复]

如何让 redux 派发一个动作并返回一个承诺?

“摇一摇做某事”代码解释

如何响应 redux 中的状态变化并派发另一个动作?