现有以下代码:function foo1(){
// code
}
function foo2(){
setTimeout(foo1,1000);
}
function foo3(){
// code
}foo2();
foo3();这段代码的效果是,先到foo2里设定了计时器,然后跳出,执行foo3,同是当计时器到1s后执行foo1.
我想得到的效果是等foo2里的foo1执行完之后才去跳出执行foo3.尝试过的办法,把foo2改成function foo2(){
//setTimeout(foo1,1000);
foo1();
sleep(1000);
}其中sleep是用循环判时实现,造成的结果是卡机。(与此同时有在其它地方用timeout在做帧动画,会造成动画也卡住)。请问各位大神还有什么办法能实现延时效果,但不影响其它的timeout正常运行。或者有什么其它的解决办法?
JavaScript函数

解决方案 »

  1.   

    你不能将javascript视为顺序执行的。
    代码一的逻辑是
       启动一个定时器,
       执行foo3,
       定时器到期执行foo1
    所以你要执行完foo1再foo3,一个是将foo3放到foo1后面,要不就这样写function foo1(){
       alert("1")
    }function foo3(){
        alert("3")
    }function foo2(){
       foo1();
       foo3();
    } setTimeout(foo2,1000);
      

  2.   


    我用的是一个函数数组,这里只是举个例子。
    在实际的代码中我并不确定functions[i]里有没有调用timeout和其它的函数。
      

  3.   

    我是在写一个类似于代码解释器一样的东西。会有很多个函数需要我依次执行,但是 functions[i] 里的 setTimeout(code1,time) 会使得 code1 晚于 functions[i+1] 执行。我希望等 functions[i] 里的 timeout 彻底执行完之后才去执行 functions[i+1].
      

  4.   


    你真的是一定要保证foo3在foo1之后,直接点,foo3的调用加到foo1里去,别放进数组。另一种思路是foo3自己保证没有错误才执行,那在foo3里就要加上判断,
    if(条件不成立){
       setTimeout(arguments.cell,100);  //arguments.callee 表示函数本身,这样就不用知道函数名了,特别是习惯使用匿名函数时特有用。
       return;
    }
      

  5.   

    function foo1(){
        // code
    foo3();
    }
    function foo2(){
        setTimeout(foo1,1000);
    }
    function foo3(){
        // code
    }
     
    foo2();