Observable.of转异步

时间:2016-11-10 14:08:04

标签: javascript asynchronous observable rxjs5

我要模拟一个包含在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转换似乎有点矫枉过正。

3 个答案:

答案 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导入),而不是asyncimport 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));