需要了解可观察执行
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 请求。
我最近开始研究 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 请求。