2014-11-06 56 views
0

I 3函数a(),b()和c()在循环中执行x次,如下所示: 我必须调用函数a (); ()完成后,我必须等待s1秒钟,然后调用函数b();经过s1秒后,我必须调用函数b(); b()完成后,我必须等待s2秒才能重新启动循环。setTimeout循环中有3个函数要在前一个完成后执行

for(var i=0; i<x; i++) { 
a(); 
setTimeout(b,s1); 
setTimeout(function() {},s2); 
} 

但是,上述循环函数a()和b()没有正确执行。无论先前的功能是否完成,它们都会执行。

我也试图与:

var FunctionOne = function() { 
// create a deferred object 
var r = $.Deferred(); 

// do whatever you want (e.g. ajax/animations other asyc tasks) 
a(); 

setTimeout(function() { 
    // and call `resolve` on the deferred object, once you're done 
    r.resolve(); 
}, s1); 

// return the deferred object 
return r; 
}; 

var FunctionTwo = function() { 
    b(); 
}; 

for(var i=0; i<x; i++) { 
setTimeout(FunctionOne().done(FunctionTwo),s2); 
} 

但期望它不工作。

你能帮助我吗?


EDIT


函数a()和b()如下:

function a() { 
$.ajax({ 
     type: $('#form1').attr('method'), 
     url: 'Misura', 
     data: $('#form1').serialize(), 
     beforeSend: function() { 
      if($.trim($('#nomeMisura').val()) == "") { 
       alert('<%= labels.getString("nomeMisuraObbligatorio") %>'); 
      $('#nomeMisura').val(""); 
      return false; 
     } 
    }, 
    success: function (data) { 
     $('#misura').attr('disabled', true); 
     $('#pulisci').attr('disabled', false); 

     misurazioneInCorso = true; 
    } 
}); 

}

function b() { 
$.ajax({ 
    type: $('#form1').attr('method'), 
    url: 'Pulisci', 
    data: $('#form1').serialize(), 
    success: function (data) { 
     var numeroCampioniMisurazione = Number(data.delta.campione2) - Number(data.delta.campione); 
     //visualizzo in tabella le misurazioni 
     $('#tabellaMisurazioni').append('<tr id="Misurazione"><td>'+data.nomeSessione+'</td><td>'+data.nome+'</td><td>'+data.delta.campione+'</td><td>'+data.delta.campione2+'</td><td>'+numeroCampioniMisurazione+'</td><td>'+data.delta.f1+'</td><td>'+data.delta.f2+'</td><td>'+data.delta.f3+'</td><td>'+data.delta.f4+'</td><td>'+data.delta.f5+'</td><td>'+data.delta.f6+'</td><td>'+data.delta.f7+'</td><td>'+data.delta.f8+'</td><td>'+data.delta.f9+'</td><td>'+data.delta.f10+'</td><td>'+data.delta.f11+'</td><td>'+data.delta.f12+'</td><td>'+data.delta.t1+'</td><td>'+data.delta.t2+'</td><td>'+data.delta.to+'</td><td>'+data.delta.ft+'</td><td>'+data.delta.rh+'</td></tr>'); 
     $('#tabellaMisurazioni tbody tr:first').html('<td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td>'); 

     $('#misura').attr('disabled', false); 
     $('#pulisci').attr('disabled', true); 
     $('#esportaCsvMisurazioni').attr('disabled', false); 
     $('#nomeMisura').val(''); 

     misurazioneInCorso = false; 
    } 
}); 

}

所以,我认为a()和b()是异步函数。

+0

可以根据需要在第二个方法什么是不工作?是'a'同步还是异步? – 2014-11-06 19:30:45

回答

0

我建议的代码与Kevin Nelson的代码非常相似。在我的代码中,“控制逻辑”不是“包含”在应用程序功能中。

您可能会发现我的“解决方案”的PDF版本 - 它包括一个“分析”,代码可能在最后找到 - 在以下链接中:http://www.aespen.ca/AEnswers/1415708506.pdf

以下内容是从PDF文档生成的。

enter image description here enter image description here

+0

我不确定这个解决方案会如我所愿,因为a()和b()函数包含异步AJAX调用。例如,在函数PL1()中,我需要a()在setTimeout(PL2,s1)被调用之前完成所有任务。 – Francesco 2014-11-12 17:53:31

+0

我不知道为什么,但你的解决方案似乎工作:)非常感谢! – Francesco 2014-11-12 18:45:53

0

你可以实现某种调度器:下面我使用一个最简单的栈,它包含一个函数或者一个等待下一个任务执行的时间。下面
代码是未经测试,但可能会给你的想法:

var tasks = [];   // list of all tasks/wait time 
var currTaskIndex = 0; 
var looping = true; 

function runTask() { 
    if (currTaskIndex==-1) return; 
    var currTask = tasks[currTaskIndex]; 
    // iterate 
    currTaskIndex++; 
    if (currTaskIndex==tasks.length) { 
     if(looping) { 
      currTaskIndex=0; 
     } else { 
      currTaskIndex=-1;    
     } 
    } 
    // run task/wait 
    if (typeof currTask == "function") { 
     currTask.call(null); 
     runTask(); 
    } else { 
    // currTask is a time -> wait 
    setTimeout(runTask, currTask); 
    } 
} 

使用与

tasks.push(a); 
tasks.push(s1); 
tasks.push(b); 
tasks.push(s2); 

runTask(); 
0

对于Asyncrhonous电话,你总是需要把“下一步行动”,这是对结果队伍异步活动结束时调用的回调方法。

根据您的意见,您的方法包含异步ajax调用。你的setTimeout调用也是异步的。如果你打电话:

setTimeout(b,s1); 
setTimeout(c,s2); 

然后两个超时将同时运行。这意味着你正在进入“回拨地狱”的世界......它并不像有些人似乎是这样做的,恕我直言,但它是一种不同的思维方式。

为了防止后续方法执行,并防止您的循环进入下一次迭代并一次执行整个循环,您需要在b的末尾以a和c结尾调用b。在开始下一次迭代之前,您还必须等待c的结束,这意味着在c完成后循环,而不是将c放入循环中......否则,您的循环将立即压缩所有x次迭代,你会让所有的方法几乎同时运行(除了a(),因为它是一个同步调用,给定我前面提到的假设)。所以,你需要做的是沿着线的东西:

var i = 0; 
var x = 100; 

function a() { 
    //end our loop inside the method 
    if(i++ < x) { 
     //shortening your ajax call to just success method 
     var ajaxSuccess = function (data) { 
      $('#misura').attr('disabled', true); 
      $('#pulisci').attr('disabled', false); 

      misurazioneInCorso = true; 

      setTimeout(b,s1); 
     } 
    } 
} 
function b() { 
    //shortening your ajax call to just success method 
    var ajaxSuccess = function (data) { 
     var numeroCampioniMisurazione = Number(data.delta.campione2) - Number(data.delta.campione); 
     //visualizzo in tabella le misurazioni 
     $('#tabellaMisurazioni').append('<tr id="Misurazione"><td>'+data.nomeSessione+'</td><td>'+data.nome+'</td><td>'+data.delta.campione+'</td><td>'+data.delta.campione2+'</td><td>'+numeroCampioniMisurazione+'</td><td>'+data.delta.f1+'</td><td>'+data.delta.f2+'</td><td>'+data.delta.f3+'</td><td>'+data.delta.f4+'</td><td>'+data.delta.f5+'</td><td>'+data.delta.f6+'</td><td>'+data.delta.f7+'</td><td>'+data.delta.f8+'</td><td>'+data.delta.f9+'</td><td>'+data.delta.f10+'</td><td>'+data.delta.f11+'</td><td>'+data.delta.f12+'</td><td>'+data.delta.t1+'</td><td>'+data.delta.t2+'</td><td>'+data.delta.to+'</td><td>'+data.delta.ft+'</td><td>'+data.delta.rh+'</td></tr>'); 
     $('#tabellaMisurazioni tbody tr:first').html('<td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td>'); 

     $('#misura').attr('disabled', false); 
     $('#pulisci').attr('disabled', true); 
     $('#esportaCsvMisurazioni').attr('disabled', false); 
     $('#nomeMisura').val(''); 

     misurazioneInCorso = false; 

     setTimeout(c,s2); 
    } 
} 
function c() { 
    //do your stuff, then loop back to a 
    a(); 
} 

a(); 

通知,我做的是把你的“下一个电话”到您的AJAX调用的成功方法的唯一的事情,和我通过c()呼叫a()而不是将其放入for()循环来循环。然后,我修改了a(),以便它在x迭代之后通过不在我放置的if()内执行而结束循环。这将确保他们顺利进行。

+0

我用()和b()函数编辑了我的第一篇文章。它们似乎是异步函数($ .ajax调用)。我还没有时间尝试任何提议的解决方案。我不知道哪一个适合异步功能。 – Francesco 2014-11-07 07:34:55

+0

已更新为使用来自ajax调用的回调。 – 2014-11-07 16:10:57

+0

此解决方案也可以:)非常感谢! – Francesco 2014-11-12 19:02:44

0
var x=5; 
outerFun(){ 
    if(x){ 
     a(); 
     setimeout(function(){ 
      b(); 
      setTimeout(function(){ 
       //do its part 
       x--; 
       outerFun(); 
      },s2);  
     },s1); 
    } 
} 
+0

解释它是如何工作的? – Markasoftware 2014-11-06 23:50:33

相关问题