为什么SwitchMap运算符仅在与Promise一起使用时会发出最后一个值



我很难理解这一点。当我将SwitchMap运算符与可观察的操作员一起使用时,它会按预期排放所有值:

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

但是,当我用承诺替换可观察到的可观察的行为时,我会得到不同的行为:

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一定不确定(我不确定规格,所以也许这就是所有浏览器中必须做的(。

>

无论如何,您可以通过传递async调度程序来强制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一样在新框架中,并且输出是您预期的。

请参阅Live Demo(Open Console(:https://stackblitz.com/edit/rxjs5-gfeqsn?file=index.ts

尝试mergeMap,也许是您要寻找的。

相关内容

最新更新