从打字稿中的异步函数返回值

约翰·史密斯 :

这是一个非常白痴的问题,对此感到抱歉,但是我找不到任何地方的答案,包括我工作场所中的老年人。

我有以下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,因为我在前几段中提到过,但是当我向他们解释这可行时,我问了他们一些改进建议,他们挠头了,没有给我答案。 。

因此,社区,您能提出一种更好的方法吗?如果可以,请向我解释在此示例中我对异步代码有什么误解?提前致谢。

Yair Cohen:

与承诺不同的是,使用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 $变量或使用asynchtml中管道。

这是对Observable经常被误解的东西,因此,我绝对建议您花更多的时间阅读有关Observable的内容,并尝试了解例如使用它们与异步等待之间的区别。

**关于可观察物的解释**

您可以将Observable视为存储值的对象,并且需要订阅以获取这些值,并且订阅是异步操作。

如果不订阅Observable,它将不会发出,也不会获得其价值。您可以返回一个Observable,但是除非您返回一个Observable并订阅它,否则您不能从Observable返回值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章