在Angular2 +中等待异步调用

时间:2018-08-20 05:27:54

标签: angular typescript asynchronous frontend

我有方法:

  prepareCalendarDaysToAdd() {
    this.getDaysToAdd();        //first line
    this.dataSaved.emit(this.daysToAdd); //second line
  }

getDaysToAdd()方法是一个异步调用:

getDaysToAdd() {
    this.daysService.getDaysInSpecificYearWith(this.toDate.year).subscribe(
      data => {
        this.getCalendarDaysFrom(data);
      },
      error => { console.error(error); },
      () => {
        this.getCalendarDaysBetween();
      }
    )
  }

问题在于数据在准备之前就发出了。 我如何才能确定第一行的异步调用是否完成?

所以我尝试获取的确切代码是:

  prepareCalendarDaysToAdd() {
    if getDaysToAdd is finished then emit list of days
  }

我试图兑现解决这个问题的承诺,但似乎我不明白它应该如何工作。

prepareCalendarDaysToAdd() {
     const promise = new Promise((resolve, reject) => {
      this.getDaysToAdd();        //first line
      resolve();
      })
      .then(
      () => {
        this.dataSaved.emit(this.daysToAdd); //second line
        }
      );
    });

1 个答案:

答案 0 :(得分:1)

使用以下代码解决您的问题:

this.dataSaved.emit(this.daysToAdd);下面的订阅函数内添加this.getCalendarDaysFrom(data);作为其异步调用,以便可以在其订阅内部完成数据发射

prepareCalendarDaysToAdd() {
    this.getDaysToAdd();        //first line
    // removed second line
  }

getDaysToAdd() {
    this.daysService.getDaysInSpecificYearWith(this.toDate.year).subscribe(
      data => {
        this.getCalendarDaysFrom(data);
        this.dataSaved.emit(this.daysToAdd); // Added in success block of subscription
      },
      error => { console.error(error); },
      () => {
        this.getCalendarDaysBetween();
      }
    )
  }