需要了解可观察执行

Need to understand the observable execution

我最近开始研究 Observables。目前对一些概念感到困惑和好奇。比方说,我有一个简单的函数,它的工作是 return 从 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?
    }

鉴于可观察对象的异步执行性质,我们无法决定在它们完成后执行的操作。特别是在像上面这样的场景中,我函数的 'return' 代码位于可观察的 subscribe() 块之后。 在这里,我需要理解,如果 return 会等到 observable 完成,或者它会立即 return 手头的值而不等待 observable 完成?当我将此 returned 值分配给其他一些变量时,可能会出现问题。所以我知道一旦 observable 完成,它就会更新 this.dataLen 值。但是当我将 this.dataLen 分配给其他变量时呢?最后,请帮助我理解 this.dataLen 的价值是多少? return语句执行后是0还是5?

return 没有意义,因为您的函数应该是异步的,而您却试图将其视为同步的。它将 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 请求。