在打字稿中循环结束时回调

时间:2018-03-29 14:27:07

标签: javascript angular typescript

我对此代码感到绝望。

getSumOfSpecificDayWeek(daysMonth: any, callback: any){
    var data = [];
    var that = this;
    daysMonth.forEach(function(day){
      that.statsService.getData(that.userid, day).subscribe(async (res: any) => {
        data = JSON.parse(JSON.stringify(res));
        console.log(that.data);
        that.data = that.data.map( function(v, i) {
          return v + data[i];
        });
      });
    });
    callback("this should be at the end");
  }

我正在做的是从服务器获取数组并将其总结为每个组件的数据。这样可以正常工作但最后我想平均结果,此时我和#39;我只是呼叫回调以显示一条消息,以检查它是否最终发生,但是没有,"这应该在结束时#34;在循环开始求和之前显示。

  mycallback(arg: any){
    console.log(arg);
  }

这是方法的主要调用

this.getSumOfSpecificDayWeek(daysMonth, this.mycallback);

3 个答案:

答案 0 :(得分:3)

多一点RxJS,但更优雅的方式:

getSumOfSpecificDayWeek(daysMonth: any, callback: any){
    var data = [];
    var that = this;
    let getCalls = []; // <--- This will contain all of your observables.
    daysMonth.forEach(function(day){
      const observable = that.statsService.getData(that.userid, day);
      getCalls.push(observable); // <--- Add the current observable to the array.
      observable.subscribe(async (res: any) => {
        data = JSON.parse(JSON.stringify(res));
        console.log(that.data);
        that.data = that.data.map( function(v, i) {
          return v + data[i];
        });
      });
    });
    // And here, you can use `callback`:
    Observable.forkJoin(...getCalls).subscribe(results => {
      callback("this should be at the end");
    });
}

答案 1 :(得分:0)

所以,这种事情在Javascript中有点令人困惑。这将做的是在后台发出daysMonth中所有内容的请求,然后调用您的回调。之前被解雇的异步请求将在某个时刻完成。

最终,您需要做的是检测您完成所有工作的时间,然后触发您的回调。看看这样的事情:

var numDone = 0;

daysMonth.forEach(function(day){
  that.statsService.getData(that.userid, day).subscribe(async (res: any) => {
    numDone++;

    data = JSON.parse(JSON.stringify(res));
    console.log(that.data);
    that.data = that.data.map( function(v, i) {
      return v + data[i];
    });

    if(numDone == daysMonth.length) {
      callback("All done!")
    }
  });
});

实际上,我们可以在getData()回调中做一些工作,如果我们是最后运行的东西,我们就会用我们想要的任何数据调用外部回调。

当然,这可能会变得混乱。 async库非常好地抽象了所有这些,因此您也可以将async.map用于您的目的。

答案 2 :(得分:0)

你需要以另一种方式管理observable

您需要执行异步操作数组,然后执行回调函数

您的代码应该看起来像

getSumOfSpecificDayWeek(daysMonth: any, callback: any){
    var data = [];
    var that = this;
    Observable.mergeArray(daysMonth.map(day=> that.statsService.getData(that.userid, day)).subscribe((arrOfResponses)=>{

// do your job with the data 
  callback("this should be at the end"); })


  }