RxJS Observable立即返回数据,为什么?

Dan*_*cal 4 javascript asynchronous rxjs typescript angular

在我目前的项目中,我发现了下面给出的函数:

translateString(stringToTranslate: string) {
    let translation;
    this.translateService.get(stringToTranslate).subscribe(
        data => {
            translation = data;
        });
    return translation;
}
Run Code Online (Sandbox Code Playgroud)

它看起来很荒谬,因为TranslateService.get()方法在每种情况下都返回一个Observable,但它实际上以某种方式工作(翻译的字符串立即返回)...这种行为的解释是什么?不应该将回调函数添加到执行堆栈并稍后运行吗?

mar*_*tin 7

您使用Observables这一事实并不意味着将在单独的JavaScript回调中调用所有内容.

实际上,大多数默认的Observable和运算符都会立即发出所有内容,默认情况下不使用任何Scheduler.例如,看看这个https://github.com/ReactiveX/rxjs/blob/master/src/observable/ArrayObservable.ts#L118

当使用例如delay()需要安排执行的运算符时,这显然是不同的,请参阅https://github.com/ReactiveX/rxjs/blob/master/src/operator/delay.ts#L52.

例如,请考虑以下示例:

Observable.from([1,2,3], Scheduler.async)
  .subscribe(val => console.log(val));

Observable.from(['a','b','c'], Scheduler.async)
  .subscribe(val => console.log(val));
Run Code Online (Sandbox Code Playgroud)

将每个发射计划到另一个JS回调中:

1
"a"
2
"b"
3
"c"
Run Code Online (Sandbox Code Playgroud)

请参阅演示:https://jsbin.com/zalugev/3/edit?js,console

如果您没有设置任何调度程序,将立即(同步)发出所有内容:

Observable.from([1,2,3])
  .subscribe(val => console.log(val));

Observable.from(['a','b','c'])
  .subscribe(val => console.log(val));
Run Code Online (Sandbox Code Playgroud)

其中打印以下内容:

1
2
3
"a"
"b"
"c"
Run Code Online (Sandbox Code Playgroud)

请参阅演示:https://jsbin.com/zalugev/4/edit?js,console

关于你的问题,你不应该依赖第三方库立即发出值,因为你永远不知道什么时候这个改变而你的代码会破坏.