2015-02-03 1 views
0

자바 스크립트 함수 foo가 있습니다. foo가 완료되면 bar를 호출하기를 원합니다. 콜백으로 시도했습니다. 작동하지 않습니다. foo가 여전히 $ .get (서버에서 매우 긴 파이썬 루틴을 시작 함)을 실행하는 동안 Bar가 호출됩니다.

function foo(callback){ 
    $.get(
     url="/myurl", 
     data={key:($(this).attr('data-button'))}, 
     function(returndata) { 
      var array = eval(returndata); 
      drawTable(array); 
     }); 

     callback(); 
    } 

foo (bar);

그러나 이것은 작동합니다. 나는 왜에 관해서 혼란 스럽다. ...

function foo(callback){ 
    $.get(
     url="/myurl", 
     data={key:($(this).attr('data-button'))}, 
     function(returndata) { 
      var array = eval(returndata); 
      drawTable(array); 
      callback(); 
     }); 

    } 

foo (bar);

는 콜백을 작성하는 간단한 개념은 아래
+0

http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

콜백이 반환되면 콜백이 발생합니다. http://stackoverflow.com/a/4560233/14104 첫 번째 콜백 당신은 동기식 호출처럼 다루고, 두 번째 호출은 비동기 호출을 위해 올바르게 처리됩니다. – epascarello

+0

그래서, 첫 번째 예에서는 $ .get을 호출하여 실행을 시작한 다음 bar라고 불리기 때문에 ($ .get이 완료되지 않았더라도) ... 두 번째 예제에서는 $ .get에 완료되면 바에 콜백하므로 제대로 작동합니다. 나는 그것을 정확하게 이해합니까? – DG1

답변

1

이것은 $.get이 비동기이기 때문입니다. 워드 프로세서에서 ...

This is a shorthand Ajax function, which is equivalent to: 
$.ajax({ 
    url: url, 
    data: data, 
    success: success, 
    dataType: dataType 
}); 

당신이 별도의 스레드에서 실행되는 것을 생각할 수있다. 그래서 bar()는 콜백 함수가 아닙니다. 그러나 두 번째 예제에서 "function (returndata)"는 $ .get에 대한 콜백 함수이므로 bar()를 사용하면 bar()는 $ .get이 끝난 후에 만 ​​호출됩니다.

+1

감사합니다. 질문에 대한 내 의견에 의미가 있습니다. – DG1

0
은 '() 바'는 응답이 부탁해 다시 콜백 오는 제공되면 호출되는대로 두 번째 경우에서 일하고

입니다 :

function func1(callback) { 
 
    alert('func1'); 
 
    callback(); 
 
} 
 

 
function func2() { 
 
    alert('func2'); 
 
} 
 

 
func1(func2);

그래서 귀하의 경우, 이상적이 작동합니다 :

function foo(callback) { 
 
    $.get(
 
    url = "/myurl", 
 
    data = { 
 
     key: ($(this).attr('data-button')) 
 
    }, 
 
    function(returndata) { 
 
     var array = eval(returndata); 
 
     drawTable(array); 
 
     callback.call(); 
 
    }); 
 
} 
 

 
function bar() { 
 
    //todo 
 

 
} 
 

 
foo(bar);