我看到了这一行代码:
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
答案 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()运算符。
答案 2 :(得分:1)
可能存在某种请求链,例如:
this.http.get(`/payments`).pipe(
mergeMap(response => this.http.post(`/audit`, response.id)),
map(secondResponse => {})
)
但最终变成了一个http呼叫。
mergeMap
或flatMap
可用于展平可观察对象(将可观察对象转换为单个可观察对象)
答案是是-更改为this.http.get('/payments')
根本不会改变行为。
答案 3 :(得分:0)
根据RxJS的文档:
当您希望展平内部时,最好使用此运算符 可以观察到但要手动控制内部数量 订阅。例如,当使用switchMap时,每个内部 订阅在源发出时完成,仅允许一个 活动内部订阅。相反,mergeMap允许多个 内部订阅一次启用。因此,其中之一 mergeMap最常见的用例是不应 取消了,想写而不是读。请注意,如果必须 维护concatMap是更好的选择。
这基本上意味着,如果您对此可观察项有多个订阅,则由于这些订阅是在内部进行管理的,因此您仍将只有一个API调用。