声明类型既不是“ void”也不是“ any”的函数必须返回一个值。从订阅返回值

时间:2019-10-05 06:41:35

标签: angular rxjs

如何从订阅返回值?下面的代码引发异常

  

声明类型既不是“ void”也不是“ any”的函数必须返回值。

getNotificationType(_activatedRouter: ActivatedRoute):Observable<number>{
  _activatedRouter.params.subscribe(params => {
      const menuId = params['id'];
      if (menuId) {
         return this.masterDataService.getNotTypeByMenu(menuId).subscribe(res => {
             if (res){
              return res.notificationType; 
             }
          })
      }
  });
}

1 个答案:

答案 0 :(得分:0)

首先:不可能,因为您正在处理异步操作。 一种帮助您的方法是将值分配给订阅中类的字段,并使函数类型为空。

您似乎对Observable有误解。 函数的Observable返回类型的确意味着您需要返回可以订阅的内容,而不是订阅的发出值。

如果您确实想获取有问题的数字,则首先应避免订阅某个子脚本中的可观察对象,因为这是导致大量内存泄漏的理想来源。也许会像switchmap这样。您的代码可能首先会变成类似以下内容:

getNotificationType$(_activatedRouter: ActivatedRoute):Observable<number>{
   return _activatedRouter.params.pipe(
      switchmap(params => {
          const menuId = params['id'];
          if (menuId) {
             return this.masterDataService.getNotTypeByMenu(menuId);
          } else {
             throwError() // or whatever you need to do in your specific case possibly include a catch
          }
      }));
}

由于您正在使用Observables,因此最好以人为的方式进行尽可能少的订阅,因为这最终会简化您的清理工作。

对于您的具体情况,了解您如何使用想要接收的号码会很有帮助。

  • 在已加载之前获取了它吗? ==> ShareReplay
  • 它显示在您的模板中吗? ==> Async pipe ...

您是否愿意分享您的特定用途,以便我们为您量身定制特定的解决方案?