需要了解可观察的执行情况

时间:2018-01-13 18:00:50

标签: angular2-observables

我最近开始挖掘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?

1 个答案:

答案 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请求。