我要模拟一个包含在observable中的http调用。我最初的想法是简单地使用与Observable.of
类似的Promise.resolve
,但它似乎不像我预期的那样有效:
Rx.Observable.of('of1').subscribe(e => console.log(e));
console.log('of2');
Rx.Observable.from(Promise.resolve('from1')).subscribe(e => console.log(e));
console.log('from2');
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.6/dist/global/Rx.umd.js"></script>
似乎Observable.of
同步运行,而Rx.Observable.from(Promise.resolve('from1'))
异步运行(这就是我想要的)。只要我想测试微调器显示,同步调用对我来说不是一个选项。
我有一些解决方案,例如延迟它或设置一个计时器:
Rx.Observable.of('of1').delay(0).subscribe...
但这对我来说也不好看。
如何让Observable.of
异步运行?将它从Promise转换似乎有点矫枉过正。
答案 0 :(得分:5)
如果您希望observable具有不同的行为,则可以将调度程序传递给它。一旦调用堆栈清除,您就可以使用异步调度程序来生成可观察的值。 代码明智,这将是这样的:
Rx.Observable.of(1, 2, 3, Rx.Scheduler.async).subscribe(
(val) => console.log(val)
);
console.log('first');
这将退出:
//first
//1
//2
//3
在这里运用jsbin示例:http://jsbin.com/cunatiweqe/6/edit?js,console
答案 1 :(得分:1)
最近的rxJS框架似乎更喜欢asyncScheduler
(从rxjs
导入),而不是async
(import from "rxjs/internal/scheduler/async"
)。示例:
import { of asyncScheduler } from "rxjs";
const ret = of(this.someVariable, asyncScheduler);
有关rxJS调度程序的更多信息,请参见here。
答案 2 :(得分:0)
这是因为observable.of默认具有空调度程序。查看官方文档:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-of
默认情况下,它使用null IScheduler,这意味着下一个 通知是同步发送的,但有不同的 IScheduler可以确定这些通知的时间 交付。
所以只需导入一个异步调度程序
import { async } from 'rxjs/scheduler/async';
并将其作为第二个参数发送
Observable.of('of1', async).subscribe(e => console.log(e));