Функция возвращается до присвоенного ей значения. Как этого избежать? - PullRequest
0 голосов
/ 10 октября 2019

Я хочу использовать возвращенный логический флаг в условии IF в 1-й функции, как показано ниже, однако 2-я функция возвращается до того, как фактическое значение будет присвоено службой. Помощь очень ценится.

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;
 }

Ошибка при разработке ниже данного решения:

  1. обновил код и попытался удалить логический тип возврата введите описание изображения здесь

  2. обновил код и попытался сохранить тип логического возврата введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Так что здесь вам нужно установить возвращаемое значение flag внутри блока subscribe(). Это связано с тем, что это тип async, и приведенный ниже код будет выполнен, даже если блок subscribe() все еще выполняется.

Так что вам нужно обновить 2-ю функцию retrieveSubModuleLoggedInInfo() как:

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

ИЛИ

Вы также можете сократить свой код блока subscribe() и пропустить создание переменной flag как:

retrieveSubModuleLoggedInInfo(component: string): boolean {
  this.activeUserService.getSubModuleLoggedInInfo('Retrieve', 'AccountsPayable', component)
     .subscribe((data: any) => {
        return !!data;
     });
 }
0 голосов
/ 10 октября 2019

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 мы меняем ответ, мы не возвращаем данные еще (flag)

Затем вы «вызываете» функцию, подписывающуюся

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

Я знаю, что это сложно, но, если вы привыкнете использовать Observables, рано его полюбите

Обновите хорошо, наша функция retrieveSubModuleLoggedInInfo возвращает Observable, поэтому мы меняем нашу функцию

retrieveSubModuleLoggedInCheck(component: string): boolean {
   this.retrieveSubModuleLoggedInInfo(component).subscribe(res=>{
      if (!res)
        return this.createUpdateLoggedInRecord(component, 1);

      this.openGenericDialog('GenericAlert', "Some text...");
      this.dialogRef.afterClosed()
        .subscribe(result => {

     });
  })
}

Ну, что произойдет, если мы сможем вызвать функцию, которая возвращает наблюдаемую в цикле. Ну, форк-джоин приходит на помощь, представьте, что у вас есть массив строк

//we create an array of observables
//we can use the map javascript method
const obs:Observables<any>[]=myArray.map(x=>this.retrieveSubModuleLoggedInInfo(x)) forkjoin(obs).subscribe((res:any[])=>{
    //in res[0] we has the response of the first observables
    //in res[1] we has the response of the second observable
    ...
})
...