我一直在阅读有关setTimeout和其他此类计时器的信息。但我想知道是否有可能处理自定义功能,以便你需要做的就是这样:
//code
delay(time);
//more code
这可能吗?
更新:好的,我有点理解。因此,如果这是不合理的,那么你将如何在第一次之后延迟循环。我希望它在执行时立即运行,但它们会在每次迭代后延迟。
新更新:我认为自从我最初的想法落空后,向我展示我的代码可能会更容易。
function autoFarm (clickEvent){
var farmTargets = [
"6_300_1",
"6_300_3",
"6_300_4",
"6_300_5",
"6_300_7"];
setTimeout(function() {
$.each (farmTargets, function(index, target){
var extraData = '{"end_pos":"' + target + '","purpose":0,"upshift":1,"bring_res":{"0":0,"2":0,"1":0},"bring_ship":{"1":25,"11":0},"rate":100,"start_pos":"6_300_2"}';
var finalData = baseDataDora + extraData + "&type=1";
setTimeout(function(){
for (i = 0; i < farmTargets.length; i++){
postRequest(sendFleetURL + getSign(extraData). finalData, function(json){
});
}
}, 15000);
});//End each loop
}, 1320000);
}//End autoFarm
基本上,它应该立即执行并在第一个数组元素上相隔15秒运行for循环5次。然后22分钟后移动到下一组并重复整个阵列。
答案 0 :(得分:1)
你可以通过发电机实现这些目标。这个想法是延续传递风格(回调地狱)可以被夷为平地。生成器使用yield
关键字暂停该函数,直到回调通过调用其next
方法恢复它:
var async = function(gen) {
var g = gen()
function next(x) {
var cur = g.next(x)
if (cur.done) {
return cur.value
}
cur.value(next)
}
next()
}
var delay = function(time) {
return function(f) {
setTimeout(f, time)
}
}
async(function* () {
console.log('before')
yield delay(1000) // waits one second
console.log('middle')
yield delay(1000) // waits one second
console.log('after')
})
在CPS中,它会读取如下内容:
console.log('before')
setTimeout(function() {
console.log('middle')
setTimeout(function() {
console.log('after')
}, 1000)
}, 1000)
今天适用于Chrome,Firefox和iojs。
答案 1 :(得分:0)
由于单线程事件循环的工作方式,这是不可能的。如果此函数存在,则会导致整个UI线程冻结,直到满足延迟。 setTimeout(cb, delay)
是最近的工具,它安排一个函数在延迟之前和当前事件循环滴答结束时执行。
更新:在有人给我打电话之前,是的,你理论上可以设计一个延迟功能,将所有内容冻结一段时间。但是,没有合理的借口这样做。
关于第二个问题:
function hello() {
console.log('hello');
}
// execute immediately
hello();
// then every 5 seconds
setInterval(hello, 5000);
答案 2 :(得分:0)
按照书面说明,这不可能。
如果您使用队列,那么以这种方式延迟是微不足道的。
jQuery的.queue()
和.delay()
函数是如何工作的一个很好的例子,所以我将使用它们作为一个例子,但是一般的观点代表任何排队库。
而不是:
//code
delay(time)
//more code
使用队列,你会写:
$('...') //some selector to act on for jQuery
.queue(function (next) {
//code
//Indicate that the queued call is finished.
next();
//This allows async code to be executed in the queue,
//such as ajax and animations
})
.delay(time)
.queue(function (next) {
//more code
next();
});
现在,即使您忽略用于注释的行,您也可以知道有更多的样板来实现所需的行为。我不觉得它过分,因为我发现它相对容易阅读: