如何在数组中循环,等待每个项目之间的时间
How to loop through an array in waiting a time between each item?
我有一个这样的数组:
var items = [["text1", 3000],["text2",4000],["text3",1000]], ...a lot more here...;
。
在html端,我们得到了<div id="d"></div>
现在,我想在3000毫秒后在div上打印出"text1",然后PC会等待4000毫秒再打印"text2",然后在1000毫秒后打印出"text3,以此类推,直到它完成循环。
我认为我们需要使用setInterval
或类似的东西,但我想起来太难了。也许是嵌套的setInterval??
所以给定一个2-D的文本数组&毫秒数,如何在指定的毫秒后打印出每个项目
注意:我需要按照items
的正确顺序打印出来,也就是说,它会先打印出text1,然后打印出text2,再打印出text3。。。
编辑
最终找到解决方案
var items = [["text1", 3000],["text2",4000],["text3",1000]];
var time=0;
printElems(0);
function printElems(i){
setTimeout(function(){
var elem=document.getElementById("d");
elem.innerHTML=items[i][0];
if(items[i+1]!=undefined){
printElems(i+1);
}
},items[i][1]);
}
<div id="d"></div>
这就行了。我在这里所做的是,只需将时间相加,并根据延迟进行setTimeout调用。这将按给定的顺序在数组中循环。
不幸的是,如果将setTimeout
(异步)封装在循环(同步)中,它们将从最短时间打印到最长时间。
为了解决这个问题,你可以使用Promises。
下面是jQuery的一个实现。递延:
var dfd = $.Deferred().resolve();
items.forEach((item) => {
dfd = dfd.then(() => print(item));
});
function print(item) {
var dfd = $.Deferred();
setTimeout(() => {
$('#d').html(item[0]);
dfd.resolve();
}, item[1]);
return dfd.promise();
}
DEMO
有承诺,紧凑:
function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
items.reduce((promise, [text, ms]) =>
promise . then(() => wait(ms)) . then(() => console.log(text)),
Promise.resolve());
使用setTimeout
,递归:
function sequence(array) {
if (!array.length) return;
var elt = array.shift();
setTimeout(() => {
console.log(elt[0]);
sequence(array);
}, elt[1]);
}
相关文章:
- 在图例项目之间添加额外空间的高图表
- 如何使用angularJS在多个项目之间共享代码
- javascript+语义ui:垂直菜单与项目之间的对话框,如何
- 如何在数组中循环,等待每个项目之间的时间
- 同位素包装中项目之间的发际线间隙在窗口调整大小时
- 如何在两个不同数组中的项目之间建立链接
- 在多个 angularjs 项目之间共享通用功能/配置
- 突出显示表格行中项目之间的差异
- AngularJS-点击ng,在ng重复中的项目之间切换
- 增加了网站上项目之间的空间
- 输入中的ngBlur和该输入框中搜索的列表项目之间的问题
- 如何在node.js项目之间重用模型
- 层次结构和多选项下拉列表(HTML),并在项目之间导航(子节点)
- 在私有项目之间共享前端组件
- 项目之间的空间
- 光滑的JS排水沟或传送带项目之间的空间
- 在Visual Studio项目之间共享HTML/Javascript
- 我如何在IDE (WebStorm)项目之间复制设置
- 在两个项目之间共享组件,同时保留热加载
- Foreach循环不显示@Html.DisplayFor中项目之间的空格