6

我很难理解这一点。当我将 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
4

1 回答 1

3

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

无论如何,您可以通过传递调度程序强制Observable.from异步发射。async

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

于 2018-02-17T16:48:47.783 回答