簡體   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