javascript - NGXS 状态不变
问题描述
可能有人知道为什么 NGXS 状态不能在 HttpClient POST 请求中改变。
ctx.patchState()
仅适用于 HTTP POST 请求之外。
@Action(SignIn)
signin(ctx: StateContext<AppStateModel>, { payload }: SignIn) {
// ctx.patchState({isLoggedIn:true}) this works!
return this.api$.signin(payload)
.pipe(
tap((user: User) => {
console.log(user);
ctx.patchState({ isLoggedIn: true })
})
)
.subscribe(
(user: User) => {
ctx.patchState({ isLoggedIn: true })
}
)
}
解决方案
实际上,状态正在发生变化,但是您看不到它,因为您返回了尚未完成的订阅。换句话说 - 一旦返回的 observable 的订阅完成,您将看到该操作被分派。
正如评论中提到的,返回的操作的可观察对象正在后台订阅,因此无需再次订阅。
话虽如此,您可以通过take(1)
管道。
它的作用是在触发一次后完成对 observable 的订阅。
@Action(SignIn)
signin(ctx: StateContext<AppStateModel>, { payload }: SignIn) {
return this.api$.signin(payload)
.pipe(
take(1), // <-- Add that
tap((user: User) => ctx.patchState({ isLoggedIn: true }))
);
}
推荐阅读
- protocol-buffers - 将 gRPC/protobuf 与 go multirepo 和 go 模块一起使用
- php - 在 PHP 中解析 HTTP api 响应字符串
- c# - ASP.NET Core MVC 1.3 Web API + Entity Framework,我不能按名称搜索数据库,但我可以按 id
- sql - 如何将 UNION SQL 与第三个表配对
- time-complexity - 我需要帮助找出这个函数的时间复杂度
- vue.js - Sass / Vue:“@use 规则必须在任何其他规则之前编写”
- c++ - 如何将测试夹具传递给 C++ GTest 中的辅助函数
- c# - Entity Framework Core 递归包含问题
- android - MediaExtractor 从多个音频文件包中提取
- javascript - 如何从 getAllInternetHeadersAsync 获取返回值?