You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:27:23