如何让ember-resources的trackedTask每两分钟执行一次?
解决方案
首先修正every2Minutes的计算逻辑——你当前用second()的逻辑完全不符合每两分钟触发的需求,应该基于分钟数来计算:
import { cached } from '@glimmer/tracking'; @cached get every2Minutes() { // 取当前时间的分钟数,除以2取整,每两分钟值才会变化一次 return Math.trunc(this.currentTime.minute() / 2); }
然后确保currentTime的实现是正确的——它必须是每分钟才更新一次的tracked变量,不能每次访问都返回新的Date实例:
import { tracked } from '@glimmer/tracking'; import { setInterval } from '@ember/runloop'; @tracked _currentTime = new Date(); constructor() { super(...arguments); // 每分钟更新一次tracked变量 setInterval(() => { this._currentTime = new Date(); }, 60000); } get currentTime() { return this._currentTime; }
最后确认trackedTask的依赖配置保持不变:
feedResource = trackedTask(this, this.fetchFeed, () => [this.every2Minutes]);
关键说明
@cached装饰器会确保every2Minutes只有在依赖的currentTime.minute()变化时才重新计算,返回缓存值时不会触发trackedTask重新执行。- 基于分钟数的计算逻辑,每两分钟
Math.trunc(minute/2)的值才会变化一次(比如0-1分钟为0,2-3分钟为1,以此类推),刚好匹配每两分钟执行一次任务的需求。
内容的提问来源于stack exchange,提问作者Andrey Stukalin
相关产品推荐
相关产品推荐

