我正在尝试在每个循环之间创建延迟。然而,我总是在循环被触发之前只有延迟结束。我这样做的方式如下:
for (var i = 0; i < items.length; i++)
{
setTimeout(function()
{
console.log(i + ". " + items[i]['name']);
priceManagement.FindPrices(items[i]['name']);
}, 3000);
}
答案 0 :(得分:2)
您的主循环正在连续执行setTimeout
个功能。由于此函数的 async 特性,您可能会看到正在执行的函数之间没有延迟。
如果你想要近似效果,当函数的执行时间多小于延迟时间时,你可以使用setInterval
。这将与Adam的anwer相同。
但是对于确切的“在每个循环之间创建延迟”,您将需要一些回调。
首先想到的是:
function main() {
doWork(items, 0, items.length);
}
function doWork(items, i, loopLength) {
// The bit in the loop
console.log(i + ". " + items[i]['name']);
priceManagement.FindPrices(items[i]['name']);
i++;
if (i < loopLength) {
delayDoWork(items, i, loopLength);
}
else {
// Do rest in the main
...
}
}
function delayDoWork(items, i, loopLength) {
setTimeout(function(items, i, loopLength)
{
doWork(items, i, loopLength);
}, 3000, items, i, loopLength);
}
这将保证循环之间的确切延迟。
修改强>
你可能想要为此做更多的实验,因为我不是专家知道setInterval
如何设计在JS中工作,因为它本质上不是多线程的?起点将考虑此SO
实际上,setTimeout()在执行队列的末尾重新排队新的JavaScript。
答案 1 :(得分:1)
你可以这样做:
ID
或者也可以将 for (var i = 0; i < items.length; i++)
{
setTimeout(function(i)
{
console.log(i + ". " + items[i]['name']);
priceManagement.FindPrices(items[i]['name']);
}, 3000*i, i);
}
作为参数传递:
items[i]['name']
我建议你阅读:http://javascriptissexy.com/understand-javascript-closures-with-ease/