如何调用多个函数,因此它们将在Angular2中相互等待

时间:2017-08-22 20:59:11

标签: javascript angular typescript

我有3个功能和一个按钮。我想按下按钮并且不是同时调用3 function,而是一个接一个地调用,所以每个函数都等待直到另一个函数(上一个函数)完成

我有onPost, onGetnavigate功能 我想做的是调用函数allTogether

allTogether() {

 this.onPost();
 this.onGet();
 this.navigate();

}

这是我的onPost方法,我将当前客户端的数据发送到后端

 onPost () {
    const messageForDb = (JSON.stringify(this.model));
    localStorage.setItem('userKey', messageForDb);
    this._httpService.postJSON(this.model)
      .subscribe(
        data => this.postData = JSON.stringify(data),
        error => alert(error),
      );
  }

这是我的onGet(),在这里我获得了有关我的客户的信息,因此我稍后可以在第三个函数中使用它navigation()

  onGet() {
        this._httpService.getCurrentState(this.model.user_email, this.model.client)
      .subscribe(
       // data => this.getData = JSON.stringify(data),
        data => this.getData = data,
        error => alert(error),
      );
  }

navigation () {
  let  part = json.message.part;
  let  num = json.message.number;
  this.router.navigate(['part'], {queryParams: {'number': 'num'}});
}

我尝试使用订阅,但失败了......那么云我如何实现函数allTogether()?我测试了所有功能,它们分开工作,但一起工作..

2 个答案:

答案 0 :(得分:2)

您可以使用Observable.forkJoin运算符使第三个函数等待第一个函数的结果。我看到它们之间的数据并不相互依赖。您还必须修改onPostonGet,以便他们返回observables

onPost () {
    const messageForDb = (JSON.stringify(this.model));
    localStorage.setItem('userKey', messageForDb);
    return this._httpService.postJSON(this.model);
 }

onGet() {
        return this._httpService.getCurrentState(this.model.user_email, this.model.client);
  }

Observable.forkJoin([this.onPost(), this.onGet()])
   .subscribe((resultArray) => {
     [postResult, getResult] = resultArray;
     this.postData = JSON.stringify(postResult);
     this.getData = getResult;
     this.navigation();
   });

答案 1 :(得分:1)

您只需要从分配数据的订阅函数部分调用下一个方法。

onPost () {
    const messageForDb = (JSON.stringify(this.model));
    localStorage.setItem('userKey', messageForDb);
    this._httpService.postJSON(this.model)
      .subscribe(
           data => { this.postData = JSON.stringify(data); this.onGet();},
           error => alert(error),
  );
}

onGet() {
    this._httpService.getCurrentState(this.model.user_email, 
    this.model.client)
      .subscribe(
       // data => { this.getData = JSON.stringify(data); this.navigate(); },
        data => { this.getData = data; this.navigate(); },
        error => alert(error),
  );

}

相关问题