在此代码中结合使用“ mergeMap”和“ of”有什么用?

时间:2019-10-02 11:03:29

标签: angular rxjs

我看到了这一行代码:

this.http.get(`/payments`)

是否与此相同(如果这样,为什么要这样写?):

SMTP SERVER: smtp.gmail.com 
Default user e-mail suffix: @gmail.com
USERNAME: username@gmail.com 
PASSWORD: password
USE SSL: checked/unchecked
PORT: 465/587
Reply-to-address: 
Charset: UTF-8

4 个答案:

答案 0 :(得分:2)

让我们看看它的作用

const httpCall = rxjs.of('payment');

httpCall.pipe(
  rxjs.operators.mergeMap(v => rxjs.of(v))
).subscribe(v => console.log(v));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>

所以基本上,它什么都不做。

答案 1 :(得分:2)

this.http.get(`/payments`).pipe(
      mergeMap((payments) => of(payments)),
);

对于每个发射的值,mergeMap()运算符创建该值的新可观察值,然后该运算符订阅该新可观察值。该可观察对象发出的每个值都转发给订户,直到内部可观察对象完成为止。

对于可观察到的源中的每个发射值重复此操作。

这里没有延迟或多播,因为of(payments)将在同一JavaScript调用堆栈中发出该值。

您可以用switchMap()替换mergeMap,它也无效。

源代码很可能是某人尝试调试或修改发出的值的残余,并且由于http.get()发出单个值,因此无论您使用mergeMap还是switchMap都没有关系在这种情况下。在HTTP调用中使用这些运算符的大多数人是链接到另一个HTTP调用。

如果您需要链接到其他HTTP调用,请查看我的{obs}库中包含的switchChain()运算符。

https://github.com/reactgular/observables

答案 2 :(得分:1)

可能存在某种请求链,例如:

this.http.get(`/payments`).pipe(
  mergeMap(response => this.http.post(`/audit`, response.id)),
  map(secondResponse => {})
)

但最终变成了一个http呼叫。

mergeMapflatMap可用于展平可观察对象(将可观察对象转换为单个可观察对象)

答案是-更改为this.http.get('/payments')根本不会改变行为。

答案 3 :(得分:0)

根据RxJS的文档:

  

当您希望展平内部时,最好使用此运算符   可以观察到但要手动控制内部数量   订阅。例如,当使用switchMap时,每个内部   订阅在源发出时完成,仅允许一个   活动内部订阅。相反,mergeMap允许多个   内部订阅一次启用。因此,其中之一   mergeMap最常见的用例是不应   取消了,想写而不是读。请注意,如果必须   维护concatMap是更好的选择。

这基本上意味着,如果您对此可观察项有多个订阅,则由于这些订阅是在内部进行管理的,因此您仍将只有一个API调用。

  • 如果是单个订阅,则没有区别