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,但它实际上以某种方式工作(翻译的字符串立即返回)...这种行为的解释是什么?不应该将回调函数添加到执行堆栈并稍后运行吗?
您使用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
关于你的问题,你不应该依赖第三方库立即发出值,因为你永远不知道什么时候这个改变而你的代码会破坏.
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |