函数在分配值之前返回。如何避免这种情况?

问题描述 投票:-1回答:2

我想在第一个函数的IF条件下使用返回的布尔标志,如下所示,但是,在通过服务分配实际值之前,返回了第二个函数。非常感谢您的帮助。

subModuleLoggedInCheck(component: string): boolean {
   console.log(this.retrieveSubModuleLoggedInInfo(component)); // always return false which is invalid
   if (!this.retrieveSubModuleLoggedInInfo(component)) {
     return this.createUpdateLoggedInRecord(component, 1);
   } else {
     this.openGenericDialog('GenericAlert', "Some text...");
     this.dialogRef.afterClosed()
      .subscribe(result => {

     });
   return false;
  }
}

retrieveSubModuleLoggedInInfo(component: string): boolean {
  var flag = false;
  this.activeUserService.getSubModuleLoggedInInfo('Retrieve', 'AccountsPayable', component)
     .subscribe((data) => {
        if(data) {
          flag= true;
          // console.log(flag);
        } else {
          flag= false;
        }
     });
     return flag;
 }
angular function return angular-services
2个回答
0
投票

因此,您需要在flag块内设置返回subscribe()的值。这是因为它是async类型,即使subscribe()块仍在执行中,下面的代码也将被执行。

所以您需要将第二个功能retrieveSubModuleLoggedInInfo()更新为:

retrieveSubModuleLoggedInInfo(component: string): boolean {
 var flag = false;
  this.activeUserService.getSubModuleLoggedInInfo('Retrieve', 'AccountsPayable', component)
     .subscribe((data) => {
        if(data) {
          flag = true;
          return flag;
        } else {
          flag = false;
          return flag;
        }
     });
 }

OR

您还可以缩短subscribe()块代码,并跳过flag变量创建为:

retrieveSubModuleLoggedInInfo(component: string): boolean {
  this.activeUserService.getSubModuleLoggedInInfo('Retrieve', 'AccountsPayable', component)
     .subscribe((data) => {
        return !!data;
     });
 }

0
投票

Kundaty,通常,如果在一个函数中有一个可观察的对象,并且想要返回一个值,则更好的方法是返回一个可观察的对象,因此您无需调用该函数,否则就订阅它。为此,您使用“ switchMap”,它使我们可以使用响应和“ of”来返回任何变量的可观察值。想象一下您的功能,例如

import {of,Observable} from 'rxjs'
import {switchMap} from 'rxjs/operators'

retrieveSubModuleLoggedInInfo(component: string): Observable<boolean>
{ 
  return this.activeUserService.getSubModuleLoggedInInfo('Retrieve', 'AccountsPayable', component)
    .pipe(switchMap(data=>{
    //here you has the value of "data"
        if(data) {
          flag= true;
          // console.log(flag);
        } else {
          flag= false;
        }
        //you need return an observable, use the 'rxjs' of
        return of(flag)
   }))
}

请参见您的函数未返回布尔值,否则未返回Observable。看看如何,我们不订阅该函数,否则使用switchMap更改响应,不返回数据else((flag)

然后您“调用”该函数订阅

this.retrieveSubModuleLoggedInInfo("hello").subscribe(res=>{
   //res will be true or false
})

我知道这很复杂,但是,如果您习惯使用Observables,那就早点爱上它吧

© www.soinside.com 2019 - 2024. All rights reserved.