[英]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.