Javascript 如何每周在数组中显示一个项目

Javascript 如何每周在数组中显示一个项目,javascript,arrays,loops,time,Javascript,Arrays,Loops,Time,我正在尝试创建一个每周记忆诗的程序。我有代码来显示该项,但只需要延迟我希望代码在更改项之前等待多长时间。如何在一个数组中一次显示一个项目一周,然后继续下一个项目而不等待一周的延迟?这就是我现在拥有的: <p id="wfm"></p> var mind = []; var i = 0; var wfmind = document.getElementById('wfm'); function next_verse() { wfmind.innerHTML

我正在尝试创建一个每周记忆诗的程序。我有代码来显示该项,但只需要延迟我希望代码在更改项之前等待多长时间。如何在一个数组中一次显示一个项目一周,然后继续下一个项目而不等待一周的延迟?这就是我现在拥有的:

<p id="wfm"></p>

var mind = [];
var i = 0;

var wfmind = document.getElementById('wfm');
function next_verse() {

     wfmind.innerHTML = mind[i % mind.length];
     i += 1;

}
setInterval(next_verse, 1000);

var mind=[]; var i=0; var wfmind=document.getElementById('wfm'); 函数next_verse(){ wfmind.innerHTML=mind[i%mind.length]; i+=1; } 设定间隔(下一节,1000);
您可以使用当前时间作为索引,它从1970年开始计算,而不是用户进入站点的任意时间

在写入时,当前时间戳为14936849486

var d = new Date();
// +d === 1493684749486
要将当前时间戳转换为数组索引,您需要知道一周内的毫秒数(1000*60*60*24*7),然后计算自1970年以来已经过去了多少周

var index = Math.floor(+d / (1000*60*60*24*7));
// 2469 weeks have passed since 1970
// output `mind[index]` now.
为了这里的答案,我假设你想在周五上午9点更改项目。下一个最接近的星期五上午9点是14940000000

d.setMilliseconds(0);
d.setSeconds(0);
d.setMinutes(0);
d.setHours(9);
d.setDate(d.getDate() + (7 + 5 - d.getDay()) % 7); // How many days away is Friday from Monday? Add that to the current date.
这是315250514毫秒。您将设置超时这么长时间来启动下一个更改

当项目更改时,为以下更改启动新的超时。这是首选的设置间隔

function displayNextItem() {
  var d = new Date();
  var timestamp = +d;
  var index = Math.floor(timestamp / (1000*60*60*24*7));
  wfmind.innerHTML = mind[index % mind.length];

  d.setMilliseconds(0);
  d.setSeconds(0);
  d.setMinutes(0);
  d.setHours(9);
  d.setDate(d.getDate() + (7 + 5 - d.getDay()) % 7); // How many days away is Friday from Monday? Add that to the current date.

  setTimeout(displayNextItem, +d - timestamp);
}
displayNextItem();

localStorage
中保存显示项目和数组索引的时间。然后,当他们回来时,从本地存储中获取时间,将其与当前时间进行比较,如果超过一周,则增加索引并显示下一次。我不确定我是否遵循。您想将延迟(当前为1000毫秒或1秒)更改为1周,但不实际等待1周?这似乎自相矛盾。出于调试目的,您显然希望将其保持在1秒或附近。@Extragorey我想他的意思是他不想使用
setInterval()
等待一周。可能是因为用户不会一直打开该页面,所以它不会工作。@Barmar啊,我明白了,在这种情况下,按照您的建议从日历中查找当前一周似乎是一个不错的选择。@axelduch也许,尽管我怀疑您只是每周更改一次邮件,准确的时间其实并不重要。谢谢!!我想我们可能拥有它!!我下周会查一下,然后告诉你。