Угловой сервис не выполняется в том же порядке - PullRequest
0 голосов
/ 29 ноября 2018

Машинописный код

 SaveEmployee() {
        let employeeAge= 0;
        employeeAge = GetAge();
        if(employeeAge >18) {
          //some logic Code comes here
        } else {
          //some other logic Code comes here
      }
    }

    GetAge() {
     let age= 0;
     this.employeeService.getAge(this.employeeId).subscribe(data => {
            age= data; });
     return age;    
    }

Я обновляю сотрудника с возрастным состоянием, используя угловой машинописный код.Здесь метод GetAge () всегда возвращает 0. Метод SaveEmployee () выполняется до вычисления возраста.Пожалуйста, помогите мне решить проблему.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Ваш асинхронный метод будет работать в другом потоке - так что я думаю, что вы не получите возраст до завершения подписки, а остальная часть кода не ждет - вы можете переместить логику внутри подписки, как это

this.employeeService.getAge(this.employeeId).subscribe((data) => {

     if(data >18) {
      //some logic Code comes here
     } else {
      //some other logic Code comes here
     }
});

Надеюсь, что это работает - счастливое кодирование:)

Обновление:

Вы можете использовать promise, чтобы получить данные, попробуйте что-то вроде этого

GetAge() {
    return new Promise(res => { 
        this.employeeService.getAge(this.employeeId).subscribe(data => {
            res(data);
           });
      });
   }

При чтении данных из обещания

SaveEmployee() {
     let employeeAge= 0;
     this.GetAge().then((res) => {
     if(res >18) {
          //some logic Code comes here
      } else {
          //some other logic Code comes here
      }
   });
 }

В противном случае вы можете отправить данные в другую функцию и обработать там логику. Я не уверен, что это правильный путь, потому что вы оказались всоздание метода, который является надежным только для функции

GetAge() {
    this.employeeService.getAge(this.employeeId).subscribe(data => {
         SomeMethod(data);
       });
     }

Я думаю, обещание может помочь вам - Счастливое кодирование :)

0 голосов
/ 29 ноября 2018

Служба http post или http get будет работать асинхронно.

Вы можете написать второй код записи, как показано ниже:

SaveEmployee() {
            let employeeAge= 0;
         this.employeeService.getAge(this.employeeId).subscribe(data => {
                employeeAge= data;
                if(employeeAge >18) {
              //some logic Code comes here
            } else {
              //some other logic Code comes here
          }
                 }); 

        }
0 голосов
/ 29 ноября 2018

ЭТО не будет.Потому что employeeService.getAge(...) будет возвращать ответ асинхронно.Чтобы это исправить, сделайте следующее:

async SaveEmployee() {
  let employeeAge = 0;
  employeeAge = await GetAge();
  if (employeeAge > 18) {
    //some logic Code comes here
  } else {
    //some other logic Code comes here
  }
}

async GetAge() {
  let age = 0;
  const age = await this.employeeService.getAge(this.employeeId).toPromise();
  return age;
}

Здесь мы используем последний синтаксис ES2018 async await, который работает с обещаниями.

У меня вместо subscribeЧто касается Observable, который возвращается employeeService.getAge(...), преобразовал его в Обещание с помощью toPromise()

Затем я могу использовать await и затем выполнить необходимое.

...