NGRX的执行顺序分派和选择

时间:2019-09-29 05:42:37

标签: javascript angular rxjs ngrx

我有一个发布按钮,它将触发addPost()方法调度动作(将发布添加到服务器),然后选择添加的发布ID。我有一个Add_Success简化程序,将添加的帖子ID分配给selectedPostId,它将由getCurrentPostHeaderId选择器使用。

我期望的正确执行顺序是: 1.调度AddPost操作 2.选择添加的帖子ID

但是第一次执行后,订单总是出错: 1.选择上一个帖子ID 2.调度AddPost操作 3.选择添加的帖子ID

在第一次运行时,执行是正确的,已调度了操作,并且在日志中显示了正确的添加ID。 enter image description here

但是,如果我在第一次运行后立即添加另一篇文章,似乎旧的选择器将首先执行,并且将显示先前的ID。此后,将仅成功添加新帖子,并选择新帖子ID。 enter image description here

我的组件:

addPost() {
const postStatus = Object.assign({}, this.newPostForm.value);
let postHeader: any = {};

postHeader.postStatus = postStatus;

this.store.dispatch(new postHeaderActions.AddToPost(postHeader)); //Add post

this.store.select(
  fromPost.getCurrentPostHeaderId
)
.subscribe((post) => {
  if (post) {
      console.log(post); //Return the new added post id
  }
});
}

我的减速机和选择器:

case ActionTypes.Add_Success: {
        console.log('hey');
        return postHeaderAdapter.addOne(action.payload, {
            ...state,
            selectedPostId: action.payload.id,
            loaded: true
        });
    }

export const getCurrentPostHeaderId = createSelector(
    getPostHeaderFeatureState,
    (state: PostHeaderState) => state.selectedPostId
);

多次运行同样如此,您可以看到从第二次运行起,它将在显示新ID之前返回先前的ID。 enter image description here

有人可以帮我吗?谢谢

1 个答案:

答案 0 :(得分:0)

仅监听下一个ID的一种方法是仅在ID更改后才监听:

this.store.select(
  fromPost.getCurrentPostHeaderId
)
   .pipe(distinctUntilChanged())
   .subscribe(...)