0

可能重复:
延迟到方法链中的下一个函数

有4个功能...

function fn1()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 1<br/>');
    },5000);
}
function fn2()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 2<br/>');
    },4000);
}
function fn3()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 3<br/>');
    },3000);     
}
function fn4()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 4<br/>');
    },1000);
}

现在,当我在按钮单击事件中一一调用这些时,它不起作用。按钮单击事件 -

$("#cmd_sync_tally").click(function(event){
    event.preventDefault();
    fn1();
    fn2();
    fn3();
    fn4();
});

结果应该像第一个函数 1 执行并写入值,然后是函数 2,依此类推。

Calling from function 4
Calling from function 3
Calling from function 2
Calling from function 1

我想知道,如何使这些调用顺序,以便函数一个接一个地执行。

4

2 回答 2

2

您的所有功能都是同时编程的,这是从超时计数开始的。

如果您想按顺序调用同时编程的函数,最干净的解决方案是链接它们:

function fn1() {   
    setTimeout(function() {
        $("#div_result_area").append('Calling from function 1<br/>');
        f2();
    },5000);
}

您可以为此使用回调模式:

function fn1(callback) {   
    setTimeout(function() {
        $("#div_result_area").append('Calling from function 1<br/>');
        callback();
    },5000);
}
...
fn1(function(){
   fn2(function(){
      fn3(fn4)
   });
});

您还可以定义超时,以便它们相加:

var time = 0;
function fn1() {   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 1<br/>');
    },time+=5000);
}
function fn2()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 2<br/>');
    },time+=4000);
}
etc.

但是如果你经常这样做,并且有更多想要排队的函数,那么最好的办法就是实现一个队列,就像在 jQuery 中所做的那样。您可以在这个相关问题中看到这样的实现。

于 2013-02-04T18:10:16.813 回答
0

您的函数以正确的顺序被调用,但超时导致它们以相反的顺序发生,因为所有超时都在脚本运行时几乎完全相同的时间设置。

换句话说,您有 4 个单独的超时设置并同时运行。

要获得您正在寻找的效果,您应该在超时时从前一个函数中调用每个函数。

function fn1()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 1<br/>');
        fn2();
    },5000);
}
function fn2()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 2<br/>');
        fn3();
    },4000);
}
function fn3()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 3<br/>');
        fn4();
    },3000);     
}
function fn4()
{   
    setTimeout(function()
    {
        $("#div_result_area").append('Calling from function 4<br/>');
    },1000);
}

$("#cmd_sync_tally").click(function(event){
    event.preventDefault();
    fn1();
});

在我的jsfiddle上查看一个工作示例。

看起来您希望函数相隔 1 秒执行,因此如果这是您的目标,则必须将所有超时更改为 1000。

于 2013-02-04T18:31:22.357 回答