- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下示例取自 @ngrx example .
我以这种方式理解这个 observable。第一map
函数获取 payload
这是要添加的书,再次由mergeMap
处理它保存到数据库的位置。
原码:
@Effect()
addBookToCollection$: Observable<Action> = this.actions$
.ofType(collection.ActionTypes.ADD_BOOK)
.map((action: collection.AddBookAction) => action.payload)
.mergeMap(book =>
this.db.insert('books', [ book ])
.map(() => new collection.AddBookSuccessAction(book))
.catch(() => of(new collection.AddBookFailAction(book)))
);
mergeMap
必需的?
@Effect()
addBookToCollection$: Observable<Action> = this.actions$
.ofType(collection.ActionTypes.ADD_BOOK)
.map((action: collection.AddBookAction) =>
this.db.insert('books', [ action.payload ])
.map(() => new collection.AddBookSuccessAction(action.payload))
.catch(() => of(new collection.AddBookFailAction(action.payload)))
);
最佳答案
虽然@cartant 添加了第一个答案,但答案和评论很难理解。这是我如何解释这段代码。
在原始代码中,this.actions$
是 原始 observable .第一个 map
创建的 observable是 外部可观察 . 内部可观察 是由 this.db.insert
创建的 observable .因此这里有 3 个 observables。
效果是 addBookToCollection$
.
这段代码(原代码)的目的是生成一个addBookToCollection$
可观察的类型 Observable<action>
.第一个map
将创建一个 Observable<Book>
.这种类型不是什么效果,所以根本不能以第一个map
结尾.此 Observable<Book>
需要转换为Observable<Action>
.
我们可以使用 switchMap
或 mergeMap
转换 Observable<Book>
至 Observable<action>
.这两种方法都将高阶 observable 转换为一阶,如下所示:Observable<Observable<Book> ----> Observable<Action>
switchMap
有利于异步操作,其中最新的内部 observable 将被发出并且可以被@ngrx 订阅。但是mergeMap
用于让所有内部 observables 作为并发进行。因此,它将允许用户选择的所有书籍从 this.db.insert
生成可观察量。 .本质上,mergeMap
需要外部可观察 来自 map
并与 合并内部可观察 来自 this.db.insert
生成一个新的一阶 observable。mergeMap
需要book
( action.payload
来自上一个 map
)并将其传递给 this.db.insert
. this.db.insert
将通过 collection.AddBookSuccessAction(book)
生成一个 Action 类型 Observable<Action>
. map
的 this.db.insert
返回到 mergeMap
和 mergeMap
返回第一个订单 Observable<Action>
.Modified Code
出了什么问题?修改后的代码仅使用 map
它返回类型为 Observable<Observable<AddBookSuccessAction>>>
的高阶 observable .这不是正确类型的效果 addBookToCollection$
应该是 Observable<Action>
类型.
关于ngrx - 这个@ngrx 示例中的 mergeMap 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162904/
在我的情况下,首先可以并行执行多个请求,在这些请求完成后,另一个请求将与先前的结果一起发送,伪代码看起来像 let uploads$ = [obs1$, obs2$, obs3$]; Observab
我正在尝试使用 mergeMap在 rxjs6我收到了这个错误: Property 'mergeMap' does not exist on type 'Observable' 我试过了import
我完全不明白 mergeMap 的用途。我听说有两种解释: 这就像 .NET LINQ 中的 SelectAll() - 不。 它是 RxJS merge 和 map 的组合 - 不(或者我无法复制它
我有一个 Observable,其中每个新值都应该引起一个 HTTP 请求。在客户端,我只关心最新的响应值;但是,我希望每个请求都能完成以进行监控/等。目的。 我目前拥有的是这样的: function
遵循 Stack Overflow 帖子中描述的最佳实践:Angular RxJS When Should I Unsubscribe From Subscription ,考虑这个 Angular
当我使用 Angular HttpClient 发出 GET 请求时,我会得到一个 observable 并在 RxJS 运算符 mergeMap 中处理它。 现在它一次又一次地抛出 404,我想捕获
我有一个可观察的流。第一个运算符是一个 mergeMap,它返回一个可观察值数组。然后我必须有第二个 mergeMap 来从第一个 mergeMap 的返回中获取最终值。我觉得第二个 mergeMap
我有一个可观察的流。第一个运算符是一个 mergeMap,它返回一个可观察值数组。然后我必须有第二个 mergeMap 来从第一个 mergeMap 的返回中获取最终值。我觉得第二个 mergeMap
抽象问题 有没有什么方法可以按照外部可观察对象的原始顺序使用 mergeMap 的结果,同时仍然允许内部可观察对象并行运行? 更详细的解释 让我们看一下两个合并映射运算符: mergeMap ...它
尝试使用 http.get 请求 URL 将经度和纬度从地理位置服务提取到 list.service。 第一期: businesses Property 'businesses' does not e
TLDR:工作示例在这个问题的最后一个代码块中。查看 @bryan60 的答案,了解使用 concat 而不是 mergeMap 的工作示例。 我试图按顺序运行多个远程请求,但只执行了第一个可观察对象
我有两个相同效果的实现,并且都有效。我很难理解两者之间的差异,哪个更“正确”。 请在下面找到它们: 选项 1. IDE 无法确定 instance 的类型在最后 map . pollingSt
在此 mergeMap 的大理石图中, 你怎么读这个表达式? // Kind of, looks like an em-dash near the end mergeMap(i => 10*i--10
在 rxjs5 文档中,它提到“为了减少多态性并从运算符中获得更好的性能,一些运算符已被拆分为多个运算符”。它的实际含义是什么以及如何使用 mergeMapTo 运算符? 最佳答案 来自docs ,m
我试图理解为什么 Rxjs 的 mergeMap 在传入身份函数时会变平 of(['click', 'tap']) .pipe( mergeMap(_ => _), tap
我试图理解为什么 Rxjs 的 mergeMap 在传入身份函数时会变平 of(['click', 'tap']) .pipe( mergeMap(_ => _), tap
我看了一个关于如何在 2 个可观察对象上使用 mergeMap() 的教程,但我仍然不清楚如何将它与超过 2 个可观察对象一起使用。 教程链接如下: https://www.youtube.com/w
在 api 调用获取数据后,我需要在 FETCH_DATA_SUCCESS 上调用一些进一步的操作。 'RESET_IMAGE_DATA' 和 'INITIALISE_FILTERS' 操作必须在每次
我需要你的帮助:) 我使用了 angular 7 和 Rxjs。为了测试,我使用了 Jest。 我的组件在 2 个 httpClient 之间使用 MergeMap,就像这样: addPost() {
如何将 mergeMap 操作排入队列,以便只有在前一个操作完成后才执行一个又一个操作? 最佳答案 您需要使用 concatMap,而不是 mergeMap。 关于javascript - RxJs
我是一名优秀的程序员,十分优秀!