Javascript 嵌套设置超时替代方案?

Javascript 嵌套设置超时替代方案?,javascript,Javascript,我需要在1秒延迟内执行3个函数 为简单起见,这些功能包括: console.log('1'); console.log('2'); console.log('3'); 我可以做到:(非常难看) 或者我可以创建一个函数的数组,并使用setInterval和global计数器 有什么优雅的方法吗 (p.s.函数2不依赖于函数1…因此-每隔一秒执行下一个函数。)。您可以在设置超时时使用类似的内容: var funcs = [func1, func2, func3], i = 0; func

我需要在1秒延迟内执行3个函数

为简单起见,这些功能包括:

console.log('1');
console.log('2');
console.log('3');
我可以做到:(非常难看)

或者我可以创建一个函数的
数组
,并使用
setInterval
global
计数器

有什么优雅的方法吗


(p.s.函数2不依赖于函数1…因此-每隔一秒执行下一个函数。)。

您可以在
设置超时时使用类似的内容:

var funcs = [func1, func2, func3],
    i = 0;

function callFuncs() {
    funcs[i++]();
    if (i < funcs.length) setTimeout(callFuncs, 1000);
}
setTimeout(callFuncs, 1000); //delay start 1 sec.

假设您在现代浏览器上运行它,或者添加了对array.map的支持,这非常简洁:

[func1, func2, func3].map(function (fun, index) {
    setTimeout(fun, 1000 + index * 1000);
}

我认为最简单的方法是在函数中创建一些闭包。

首先,我想起来,您对使用
setInterval
非常感兴趣,因为
setTimeout
的开销可能会使它偏离目标10毫秒。因此,特别是如果使用short(),这里有两种方法。一种是setTimeout,另一种是setInterval。我认为第一种更好

for(var i=1;i++;i=3)clearInterval(nt);

}, 1000);es6中有一种称为生成器的新型函数声明(又称ecmascript 6,es2015)。它在这种情况下非常有用,使异步代码看起来是同步的。es6是2015年最新的JavaScript标准。它可以在现代浏览器上运行,但现在即使在较旧的浏览器上,您也可以使用它的javascript和它的polyfill来使用生成器

这是一个关于生成器的教程

下面的函数myDelayedMessages是生成器的一个示例。Run是一个辅助函数,它接受它调用的生成器函数,并提供一个函数来推进生成器,作为它调用的生成器函数的第一个参数

函数延迟(时间,回调){
setTimeout(函数(){
回调();
},时间);
}
函数运行(generatorFunction){
var generatorItr=发电机功能(恢复);
功能恢复(回调值){
generatorItr.next(回调值);
}
generatorItr.next()
}
运行(函数*myDelayedMessages(恢复){

对于(var i=1;i)如果它们不是依赖的,那么为什么它们需要在不同的时间执行?(只需确保它是必需的)您可以简单地分别使用3个超时,一个在1秒,第二个在2秒,依此类推…使用setTimeout with loop…for(…){setTimeout(function(){},1000*index);}或者类似的this@Salketer可能是网络压力?这有什么关系?@RoyiNamir我只是建议你再考虑2分钟,并确保它是必要的……至于网络压力,我曾经有一个脚本,它一个接一个地执行多个ajax调用,最终获得一个完整的页面,而大多数IE7和IE8用户都不会收到该页面整页。我们从未发现问题所在…如果你有一个巨大的应用程序,或者在zend或类似的平台上运行,那么在PHP内存中加载所有内容3次而不是一次可能会导致性能问题…只是希望你节省一些时间,如果你不是绝对需要这种调用,对不起。这就是我所想的(在我的问题中已经提到了这一点)-但我想知道是否有更多的解决方案…如果调用callFuncs两次会发生什么??:-)-只有一个闭包-更一般地说,这段代码是不可重用的。这不干净,我可能会在其他地方使用。如果500毫秒后调用callFuncs怎么办?…如果以后要链接其他函数怎么办?重置i,更改funcs值,然后调用callFuncs?丑陋…使用箭头函数
setTimeout(()=>console.log('1'),1000);设置超时(()=>console.log('2'),2000);设置超时(()=>console.log('3'),3000);
var funcs = [func1, func2, func3],
    i = 0,
    timer = setInterval(callFuncs, 1000);

function callFuncs() {
    funcs[i++]();
    if (i === funcs.length) clearInterval(timer);
}
setTimeout(function(){console.log('1')}, 1000);
setTimeout(function(){console.log('2')}, 2000);
setTimeout(function(){console.log('3')}, 3000);
[func1, func2, func3].map(function (fun, index) {
    setTimeout(fun, 1000 + index * 1000);
}
function chainLaunch(funcArray, time_ms) {
  if (!funcArray || !funcArray.length) return;
  var fi = 0; // function index
  var callFunction = function () {
      funcArray[fi++]();
      if (fi==funcArray.length)
              clearInterval(chainInterval);
   } ;
  var chainInterval = setInterval( callFunction, time_ms);
}
var f1 = function() { console.log('1'); };
var f2 = function() { console.log('2'); };
var f3 = function() { console.log('3'); };

var fArr = [f1, f2, f3];

chainLaunch(fArr, 1000);