创造一个"延迟" JS中的功能?

时间:2015-04-25 23:40:42

标签: javascript timer

我一直在阅读有关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分钟后移动到下一组并重复整个阵列。

3 个答案:

答案 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();
});

现在,即使您忽略用于注释的行,您也可以知道有更多的样板来实现所需的行为。我不觉得它过分,因为我发现它相对容易阅读:

  1. 排队发生事情
  2. 等待一些毫秒数
  3. 排队其他事情