Angular服务未按相同顺序执行

时间:2018-11-29 06:39:10

标签: .net angular typescript

打字稿代码

 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 :(得分:0)

不会。因为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;
}

在这里,我们使用的是可用于Promise的最新ES2018 async await语法。

我不是subscribeObservable返回的employeeService.getAge(...),而是使用toPromise()将其转换为Promise。

然后我可以在其上使用await,然后执行有需要的操作。

答案 1 :(得分:0)

您的异步方法将在不同的线程中运行-因此,我认为您不会在订阅完成之前就已经存在了,其余代码不会等待-您可以像这样在订阅内部移动逻辑

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

我认为Promise可能对您有所帮助-编码愉快:)

答案 2 :(得分:0)

http帖子或http get服务调用将异步工作。

您可以像下面这样编写第二个写代码: