gpt4 book ai didi

promise - 为什么 switchMap 运算符在与 Promise 一起使用时仅发出最后一个值?

转载 作者:行者123 更新时间:2023-12-02 16:48:52 26 4
gpt4 key购买 nike

我有点难以理解这一点。当我将 switchMap 运算符与 Observable 一起使用时,它会按预期发出所有值:

Observable.from([1, 2, 3, 4, 5])
.do(console.log)
.switchMap(i => Observable.of('*' + i))
.do(console.log)
.subscribe();

结果:

1
*1
2
*2
3
*3
4
*4
5
*5

但是当我用 Promise 替换 Observable 时,我得到了不同的行为:

Observable.from([1, 2, 3, 4, 5])
.do(console.log)
.switchMap(i => new Promise((resolve) => resolve('*' + i)))
.do(console.log)
.subscribe();

结果:

1
2
3
4
5
*5

最佳答案

这按预期工作。正如你所说的意外行为是因为 Observable.fromObservable.of 总是严格同步的,而 new Promise 不一定是同步的(我'我不确定规范,所以也许这就是 Promise 在所有浏览器中必须做的事情)。

无论如何,您可以通过传递 async Scheduler 来强制 Observable.from 异步发出。

import { Observable } from 'rxjs';
import { async } from 'rxjs/scheduler/async';

Observable.from([1, 2, 3, 4, 5], async)
.do(console.log)
.switchMap(i => new Promise((resolve) => resolve('*' + i)))
.do(console.log)
.subscribe();

现在,每次发射都在一个新框架中,就像 Promise 一样,并且输出如您所期望的那样。

查看现场演示(打开控制台):https://stackblitz.com/edit/rxjs5-gfeqsn?file=index.ts

关于promise - 为什么 switchMap 运算符在与 Promise 一起使用时仅发出最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com