javascript - 如何在 JQuery 中为每个循环制作可变延迟/睡眠
问题描述
我见过许多其他人提出与此有关的问题,但没有一个答案真正有效,也不适用于我的情况。
我只是想在我的每个可变时间长度的循环中实现一个延迟。这些可变时间长度来自我在读取 json 文件时循环的数组。为了提供进一步的上下文,目的是在可变的时间内突出显示句子中的每个单词 - 每个单词都有来自 json 文件的相关时间(以毫秒为单位)。
我的假设是该解决方案与 setTimeout 有关,但每次我尝试它最初等待但随后跳过所有其余部分。
我现在的代码:
$("[id^='timing_check']").click(function() {
sn = $(this).attr('name');
ayahnum = $(this).attr('data-id');
$.getJSON("/static/json/mishary.json", function(result) {
$.each(result, function(i, v) {
if (v.ayah == ayahnum && v.surah == sn) {
var x = v.segments;
var i = 1;
x.forEach(function(item) {
time_sleep = item[3];
wordref = sn + ':' + ayahnum + ':' + i;
i++;
setTimeout(function() {
$("[name='" + wordref + "']").css('color', 'red');
}, time_sleep);
});
}
});
});
});
});
这根本行不通。差远了。请提供一些指导
解决方案
我认为问题如下,让我们假设这段代码:
array1 = [1000, 2000, 1000, 4000, 10000];
array1.forEach(function(item) { //all actions start at 0
setTimeout(function() {
console.log("some action of item "+item);
}, item);
}
);
所有setTimeout
函数都是从0+item time 开始计算的,所以时间 1000 和 1000 将同时执行。也许您想计算item[i1]+item[i2]之类的时间,那么您必须将每次迭代中花费的所有时间相加。这种方式的代码将类似于:
array1 = [1000, 2000, 1000, 4000, 10000];
var abs = 0;//beginning
array1.forEach(function(item) {
if(!abs){
abs = item;
}else{
abs += item;//sum time spent
}
console.log("set "+abs+" to setTimeout");
setTimeout(function() {
console.log("some action of item "+item);
}, +abs);
}
);
在本例中,第 2 个 1000 将在 1000 和 2000 之后计算,即循环触发后 4000 毫秒。
推荐阅读
- python-3.x - 如何在 ODE 右侧实现矩形脉冲(不连续性)?
- javascript - Prefilling a
record with render - php - 在 WooCommerce 管理订单页面的状态下拉列表中隐藏订单状态
- r - 找到一个值的百分位数.. ecdf 返回一个看起来很奇怪的值
- css - 是否可以使用纯 css 禁用 mat-tab 动画
- javascript - 无法读取 Object.xorBlock 中未定义的属性“0”(crypto-js.js:3620)
- laravel - Laravel 瞬态队列和消息
- python - 更改部分 sting 方法并将其附加到打印功能
- javascript - 将对象导出并附加到 csv
- matlab - 将文本放在图形matlab上的特定位置