这是一个非常白痴的问题,对此感到抱歉,但是我找不到任何地方的答案,包括我工作场所中的老年人。
我有以下Angular代码:
function getID(): string{
var varitem = '';
this.someApi.getSomeObject().subscribe((item: Item) => {
varitem = item.id;
});
return varitem;
}
令人惊讶的是,此代码有效。当我打电话给他时,我收到了正确的ID。但是当我写它的时候,我首先意识到的是this.someApi.getSomeObject().subscribe
返回了一个Observable,所以调用是异步的,因此,根据我对异步代码的理解不足,return varitem
它将在异步代码之前运行,并且此函数将返回''总是。
正如我提到的那样,此代码有效,但是由于我感觉自己做错了这一点,因此尝试以此方式进行重写。
function getID(): string{
var varitem = '';
this.someApi.getSomeObject().subscribe((item: Item) => {
return item.id;
});
}
但是在这种情况下,正如您所看到的,Typescript抱怨是因为当一个函数具有一个签名,该签名说它应该返回一个值时,该值必须作为该函数的最后一条语句返回。
好吧,我工作场所的高级开发人员拒绝了我的PR,因为我在前几段中提到过,但是当我向他们解释这可行时,我问了他们一些改进建议,他们挠头了,没有给我答案。 。
因此,社区,您能提出一种更好的方法吗?如果可以,请向我解释在此示例中我对异步代码有什么误解?提前致谢。
与承诺不同的是,使用return关键字返回响应不会将其返回到函数,因为它返回的是预订而不是值。您要做的是返回一个Observable,然后订阅它。
您可以将代码修改为以下形式:(在示例中,我使用RxJs 映射运算符预先返回了正确的值)
function getIdFromDB(): void {
const itemId$ = this.getID();
// subscribing:
itemId$.subscribe(item => console.log(item));
}
function getID(): Observable<string>{
return this.someApi.getSomeObject()
.pipe(map(item => item.id))
}
请记住,为了真正获得该值,您需要订阅itemId $变量或使用async
html中的管道。
这是对Observable经常被误解的东西,因此,我绝对建议您花更多的时间阅读有关Observable的内容,并尝试了解例如使用它们与异步等待之间的区别。
**关于可观察物的解释**
您可以将Observable视为存储值的对象,并且需要订阅以获取这些值,并且订阅是异步操作。
如果不订阅Observable,它将不会发出,也不会获得其价值。您可以返回一个Observable,但是除非您返回一个Observable并订阅它,否则您不能从Observable返回值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句