我正在尝试更改文本,以便一次以几乎连续的方式一次出现。
columns.forEach((x) => {
setTimeout(() => {
x.style.color="red"
}, 2500)
})
但是,这只是延迟了它们发生2500ms的时间,然后在2500ms之后,它们都同时改变。
答案 0 :(得分:4)
.forEach()
方法将索引值作为第二个参数传递。您可以将其乘以某个常数以分散计时器:
columns.forEach((x, index) => {
setTimeout(() => {
x.style.color="red";
}, 2500 + index * 500);
});
答案 1 :(得分:2)
Promises
与async / await
一起使用,使这种处理看起来更加自然,并且易于遵循/调试。
const columns = document.querySelectorAll("td");
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
async function run() {
for (const c of columns) {
await sleep(2500);
c.style.color = 'red';
}
}
run();
td {
border: 1px solid black;
padding: 5px;
margin: 3px;
}
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
</tr>
</table>
答案 2 :(得分:0)
这样的事情怎么样?
# cat forEachAsync.js
function forEachAsync(array, fun, cb) {
var index = 0;
if (index == array.length) {
cb(null);
return;
}
var next = function () {
fun(array[index], function(err) {
if (err) {
cb(err);
return;
}
index++;
if (index < array.length) {
setImmediate(next);
return;
}
//We are done
cb(null);
});
};
next();
}
var columns = [1,2,3,4,5]
forEachAsync(columns, function(e, cb) {
console.log('changing column: ' + e);
// let them know we have done with this
// entry so we can start processin the
// next entry.
cb();
}, function(err) {
if (err) {
console.log('Failed in the process' + e.toString());
return;
}
console.log('## done ##');
});
# node forEachAsync.js
changing column: 1
changing column: 2
changing column: 3
changing column: 4
changing column: 5
## done ##
#