我最近开始挖掘Observables。目前对一些概念感到困惑和好奇。可以说,我有一个简单的函数,其作用是返回从http.get(...)接收的数据的长度。
因此,我使用Observable从使用angular http服务的web api获取结果。
我的功能如下所示 -
dataLen:number = 0;
obsData: Observable<any>;
getDataLength(): number {
this.obsData = return this._http.get(this.baseUrl + 'someMethod').map(res => res.json());
this.obsData.subscribe(
data => {
this.dataLen = data.length; //suppose data.Length = 5
},
err => console.log(err),
() => { console.log('Length captured successfully'); }
);
return this.dataLen; //will this line be executed first before 'this.obsData.subscribe(...);' or 'return' will always be executed last?
}
鉴于observables的异步执行性质,我们无法确定一旦完成后要执行的操作。特别是在上面的场景中,我的函数的'return'代码位于可观察的subscribe()块之后。 在这里,我需要理解,如果return会等到observable完成,或者它会立即返回值而不等待observable完成?当我将此返回值分配给其他变量时,可能会出现问题。所以我知道,一旦observable完成,它将更新this.dataLen值。但是,当我将this.dataLen分配给其他变量时呢?最后,帮助我理解this.dataLen的价值是什么?在return语句执行后是0还是5?
答案 0 :(得分:0)
return
没有意义,因为当你试图将它视为同步时,你的函数应该是异步的。它将返回0,因为Js不会等待subscribe()
完成。这是一个片段,可以看到真正发生的事情:
var ob = Rx.Observable.of(1, 2, 3, 4, 5);
var item = 0;
(function() {
ob.subscribe(num => {
setTimeout(() => {
item = num;
console.log(item + ' in subscribe')
}, 0)
})
console.log(item)
return item;
})()
console.log(item)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
setTimeout只是模仿HTTP请求。