繁体   English   中英

在打字稿循环结束时回调

[英]callback at the end of a loop in 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");
  }

在这里,我正在做的是从服务器获取数组并将其汇总到该组件每个组件的data.data中,这很好,但最后我想对结果取平均,此刻我只是在调用回调以显示一条消息,以检查它是否最终发生,但是不,在循环开始求和之前会显示“这应该在末尾”。

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

这是该方法的主要调用

this.getSumOfSpecificDayWeek(daysMonth, this.mycallback);

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

因此,可悲的是,这种事情在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

您需要以其他方式管理可观察对象

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

您的代码应该看起来像

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


  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM