Javascript 如何在每个项目经过5分钟后发出事件(相对于项目时间戳)?

Javascript 如何在每个项目经过5分钟后发出事件(相对于项目时间戳)?,javascript,angular,rxjs,Javascript,Angular,Rxjs,我有一堆物品(如下)是通过服务获取的 我使用json服务器从本地db.json文件推送和获取项目 因此,每个项目都使用json服务器推送到本地数据库 推送每个项目时,时间戳也会附加到项目上 该应用程序背后的想法是跟踪项目。因此,假设推送项目后已过5分钟(相对于项目的时间戳,例如项目[index_of_some_item]。时间&而不是相对于创建componenet) 因此,当当前时间超过数组中项目的时间5分钟时,创建项目后,应用程序会为该特定项目发出一个事件(如消息“项目[1]已过去5分钟”…如

我有一堆物品(如下)是通过服务获取的

我使用json服务器从本地db.json文件推送和获取项目

因此,每个项目都使用json服务器推送到本地数据库

推送每个项目时,时间戳也会附加到项目上

该应用程序背后的想法是跟踪项目。因此,假设推送项目后已过5分钟(相对于项目的时间戳,例如项目[index_of_some_item]。时间&而不是相对于创建componenet)

因此,当当前时间超过数组中项目的时间5分钟时,创建项目后,应用程序会为该特定项目发出一个事件(如消息“项目[1]已过去5分钟”…如是)

这样,应用程序将为每个项目发出通知消息(在创建特定项目后5分钟后…有点像警报)

我想要实现的是,当一个项目的时间已过5分钟时,我想要发出一个事件(这应该通过与该项目的时间戳进行比较来实现)

用rxjs在angular中如何做到这一点

注意 我本可以用定时器完成类似的事情

timer(300000).pipe(// do something)
但这种方法的问题是,它在组件初始化时开始计数

我想实现的是,我想跟踪每个项目的时间戳,这样,如果它已经超过5分钟,就会触发一个事件

这就是我尝试过的:但是它;'那没用

    of(this.item.time).pipe(tap(time =>
    {

      if (Date.now() === time + 300000)
      {
        console.log('time has passed');
      }
    })
    ).subscribe();
所以我想在Date.now()==时间+300000:-

when

Date.now() === time + 300000

// do something
我想发起一个活动

再次记录


我不想做与组件创建相关的事情。这是因为,如果我关闭应用程序并再次继续使用它,setInterval将再次为以前创建的每个组件启动。这是不公平的

但是,如果我们观察json服务器db文件中项目的时间戳,它将与项目的时间戳相关随着时间的推移,将为每个项目触发新消息。这是保持跟踪项目的正确方法

心理图片

为了清楚地了解应用程序

让我们想象一个待办事项应用程序。 因此,每个新项目都将被推送到本地json服务器db.json文件中。 &所有这些新增内容也将反映在模板中。 假设我在待办事项应用程序中添加了10项。(假设这只需要几秒钟)

然后我关闭应用程序(浏览器)

4分钟后我回来并重新打开该应用程序(在浏览器中)

现在,由于每个项目的5分钟已经过去,我将能够看到一个通知,5分钟已经过去了


现在,如果我再次输入另外7项,那么5分钟后,我将能够看到一条消息,这7项已经过去了5分钟,前10项已经过去了10分钟,就像这样。。。如果我再输入4个项目,我会在15分钟后收到一条消息,前10个项目15分钟过去了,后7个项目10分钟过去了,最近4个项目5分钟过去了。这样就可以在创建每个对象时为其设置间隔

setInterval(function (referenceToObject) {
    runYourFunction(referenceToObject);
}, 1000*60*5);
或者设置无限循环检查所有对象的时间戳,如果时间戳较大,则调用函数

伪代码:

while(true):
  sleep 1 second
  getAllItems.foreach():
    if(differenceOfNowAndTimestamp > 5 minutes):
      runFunction()
      removeElement or changeTimestampOfElement

这就是我的理由:

  • 主要震源由2个可观测物组成:
    • 从服务器接收到的现有$-数据
    • newItem-每次创建新项目时发出的主题
  • delayWhen
    操作员-将根据此项目的时间发出通知
const BACKOFFTIME=1000*60*5;
//假设`getItemsFromServer()`返回项[]
//“mergeAll”用于单独发出每个项
const existentItems$=getItemsFromServer().pipe(mergeAll());
const newItem=新主题();
合并(
现存项目$,
newItem.pipe(
//`addRawItemToDB`返回`Observable`
合并映射(项=>addRawItemToDB(项))
)
).烟斗(
延迟时间(项目=>{
const{time:setAt}=item;
const now=Date.now();
常数增量=现在-设定值;
const needsToSendNotif=增量<回退时间;
const toWait=needsToSendNotif?setAt+BACKOFFTIME-now:0;
返回计时器(toWait);
}),
地图(
项目=>({
项目
分钟显示:数学地板((Date.now()-item.time)/BACKOFFTIME),
})
),
过滤器(item=>item.MinuteShown>=5),
)

我不想做与组件创建相关的事情。这是因为如果我关闭应用程序并继续使用它,setInterval将再次启动。这是不公平的。但是,如果我们观察json服务器db文件中项目的时间戳,它将与项目的时间戳相关。这是保持跟踪项目的正确方法。您需要无限循环或任何进程检查项目的每个固定间隔(例如1秒)时间戳。
while(true):
  sleep 1 second
  getAllItems.foreach():
    if(differenceOfNowAndTimestamp > 5 minutes):
      runFunction()
      removeElement or changeTimestampOfElement