调用getAllDropsVolumePerDate后dropVolume始终为0的技术求助
问题原因与解决方案:dropVolume始终返回0
核心问题出在异步操作的执行顺序上:
this.campaignService.getAllCampaigns()返回的是Observable,属于异步操作,subscribe里的回调函数要等后端数据返回后才会执行。- 你的方法在调用
subscribe之后立刻就返回了this.dropVolume,这时候回调里的累加逻辑根本还没跑,返回的自然是初始值0。 - 另外,
subscribe回调里的return this.dropVolume毫无意义,它只是回调函数的返回值,不是整个方法的返回值。
解决方案1:返回Observable,让调用方订阅
把方法改成返回处理后的Observable,用map操作符计算总量,同时同步更新类属性:
dropVolume = 0; getAllDropsVolumePerDate(date: string): Observable<number> { return this.campaignService.getAllCampaigns().pipe( map(res => { let totalVolume = 0; res.forEach(campaign => { campaign.drops.forEach(drop => { if (drop.dropDate === date) { totalVolume += drop.dropVolume; } }); }); this.dropVolume = totalVolume; // 同步更新类属性 return totalVolume; }) ); }
调用时通过订阅获取结果:
this.getAllDropsVolumePerDate('2024-05-20').subscribe(total => { // 在这里使用计算后的total,或者直接用this.dropVolume console.log('总容量:', total, this.dropVolume); });
解决方案2:用async/await转成Promise处理
如果更习惯同步写法,可以把Observable转成Promise,用async/await等待结果:
dropVolume = 0; async getAllDropsVolumePerDate(date: string): Promise<number> { const campaigns = await this.campaignService.getAllCampaigns().toPromise(); let totalVolume = 0; campaigns.forEach(campaign => { campaign.drops.forEach(drop => { if (drop.dropDate === date) { totalVolume += drop.dropVolume; } }); }); this.dropVolume = totalVolume; return totalVolume; }
调用时需要用await(必须在async函数内):
async someOtherMethod() { const volume = await this.getAllDropsVolumePerDate('2024-05-20'); console.log('总容量:', volume, this.dropVolume); }
内容的提问来源于stack exchange,提问作者Wahéb
相关产品推荐
相关产品推荐

