2013-06-09 6 views
0

내 문제가 무엇인지 보여주기 위해 예제를 만들었습니다. 코드를 게시하고 설명합니다.함수를 변경하지 않고 비동기 함수 호출

내 JS :

$('#mybtn').on('click', function(){ 
//$(fn1).promise().done(fn2); 
$.Deferred(fn1).then(fn2); 
}); 

function fn1(){ 
    console.log("1"); 
      $.ajax({ 
      url: 'ajax.php', 
      type: 'POST', 
      data: { 
       func: "1" 
      }, 
      success: function(data){ 
       console.log(data); 
      } 
     }); 
} 

function fn2(){ 
    console.log("2"); 
      $.ajax({ 
      url: 'ajax.php', 
      type: 'POST', 
      data: { 
       func: "2" 
      }, 
      success: function(data){ 
       console.log(data); 
      } 
     }); 
} 

내 PHP : 그래서, 내가 마지막에 그들을 위해 함수를 호출하고 기다리는 그 2 가지 방법으로 시도

<?php 
$request = $_POST['func']; 

    switch ($request) { 
     case '1': 
      fn1(); 
      break; 
     case '2': 
      fn2(); 
      break;     
    } 

    function fn1(){ 
     print "1"; 
     sleep(4); 
    } 

    function fn2(){ 
     print "2"; 
     sleep(2); 
    } 

?> 

, 첫 번째 : // $ (fn1) .promise(). done (fn2); 1, 2, 2, 1을 인쇄하십시오. 둘째 : $ .Deferred (fn1) .then (fn2); print 1, 1, stop, 그냥 fn2를 호출하지 마십시오. 인쇄하고자하는 것은 1, 1, 2, 2입니다. 변수에서 ajax 요청을 반환하는 문제를 해결 한 다음 promise()를 사용합니다. done 그러나 나는 그것을 할 수 없다, 나는 그것을 바꾸지 않고 함수를 기다릴 필요가있다, 가능하다? 이 말은 다음과 같습니다.

toWait.someWayToWait().then(anotherFunctionToWait()); 

    function toWait(){ 
     //whatever code or functions in here. 
     fn1(); 
     fn2(); 
     fnX(); 
    } 

function anotherFunctionToWait(){ 
    //whatever code or functions in here. 
} 

감사합니다.

+0

각 기능에 대한 콜백을 전달할 수 없습니까? – tymeJV

+0

@ tymeJV 당신이 정확히 이해하지 못했을 겁니다. – Eduardo

+0

'function fn1 (callback) '과 같은 콜백 함수를 참조하십시오. – tymeJV

답변

0

아니요. 기능은 호출자가 완료 시점을 알 수 없으므로 수행을 기다릴 수 없습니다. 어떻게 든 기능을 변경해야합니다.

엄밀히 말하면, 그것은 monkeypatching으로 완성 될 수 있지만, 그것을하는 것은 끔찍한 방법입니다.

+0

Aaaw, 나는 그때해야 할 일이 많을 것 같아, 고마워. – Eduardo

관련 문제