我对此代码感到绝望。
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);
答案 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"); })
}