2014-11-06 1 views
0

3 함수 a(), b() 및 c()가 다음과 같이 루프에서 x 번 실행되도록 함수를 호출합니다. 함수 a(); a()가 완료된 후에 함수 b()를 호출하기 전에 s1 초 기다려야합니다. 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


함수는() 및 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; 
    } 
}); 

}

그래서, 나는 생각합니다()와 b() 비동기 함수입니다.

+0

작동하지 않습니다 무엇? 'a'는 동기식인가 비동기식인가? –

답변

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() 함수에서 setTimeout (PL2, s1)이 호출되기 전에 a()가 모든 작업을 완료해야합니다. – Francesco

+0

나는 왜 그런지 모르지만 당신의 해결책이 효과가있는 것 같습니다 :) 많은 감사합니다! – Francesco

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); 
    } 
} 

사용

Asyncrhonous 호출의
tasks.push(a); 
tasks.push(s1); 
tasks.push(b); 
tasks.push(s2); 

runTask(); 
0

과 :
코드는 아래의 검증되지 않은,하지만 당신에게 아이디어를 줄 수도 비동기 활동이 종료 될 때 호출되는 콜백 메소드로 전달합니다.

귀하의 의견에 비동기식 아약스 호출이 포함되어 있습니다. setTimeout 호출도 비동기입니다. 전화 할 경우 :

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

두 시간 초과가 동시에 실행됩니다. 이것은 당신이 "콜백 지옥 (callback hell)"의 세계로 들어서고 있다는 것을 의미합니다 ... 어떤 사람들은 IMHO가되도록 만드는 것만 큼 힘들지는 않지만, 생각의 다른 방식입니다.

후속 방법이 실행되지 않도록하고 루프가 다음 반복으로 진행되지 않도록하고 전체 루프를 한 번에 수행하지 않으려면 b의 끝에서 b를 호출하고 b의 끝에서 c를 호출해야합니다. 다음 반복을 시작하기 전에 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 호출의 성공 방법으로 "다음 호출"을 가하고하고있어 유일한 것은, 내가 해요 루프 for()에 루프를 넣는 대신 c()a()으로 호출하여 루핑합니다. 그런 다음 a()을 수정하여 x 반복 후 루프를 종료하고 if() 내부에 배치하지 않았습니다. 그러면 순서대로 진행됩니다.

+0

a() 및 b() 함수를 사용하여 첫 번째 게시물을 편집했습니다. 비동기 함수 ($ .ajax 호출) 인 것 같습니다. 아직 제안 된 솔루션을 시도 할 시간이 없습니다. 어느 것이 비동기 함수에 적합한 지 모르겠습니다. – Francesco

+0

ajax 호출의 콜백을 사용하도록 업데이트되었습니다. –

+0

이 솔루션은 너무 효과적입니다 :) 많은 감사드립니다! – Francesco

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

작동 방식에 대한 설명? – Markasoftware

관련 문제