2011-12-19 3 views
1

아마도 당신에게 분명하지만, 알아 내지 못합니다.내부 함수의 값을 반환하는 함수를 만드는 방법은 무엇입니까?

내부 함수의 값을 반환하는 함수를 만들어야합니다. 즉, JSON 객체를 반환해야하는 함수 get_users()이 있습니다. JSON 객체는 $.post (jQuery가 내장되어 있음)에 있습니다.

function get_users() {  
    return 
     $.post(
      url_base + 'travel/trip/get_users/' + trip_id, 
      function(response) {  
       return response;  
      }, 
      'json' 
     );  
} 

(위 내가 할 뭘하려하지만 undefined을 반환 - 어떤 놀람) 때문에 변수 범위의

, 그것을 볼 수 없습니다 때문에 나는 단지 내부 기능에 변수를 만들 수 없습니다 주요 기능. 전역 변수를 사용하지 않으려합니다. 더 나은 솔루션을 찾고 있습니다!

어떤 조언을 주셔서 감사합니다!

+0

'post'는 비동기식이므로 사용자가하려는 것처럼 값을 반환 할 수 없습니다. 당신이 정말로 이것을 필요로한다면, 나는 advice가 아니지만, ajax 호출을 synchronous [async : false] (http://api.jquery.com/jQuery.ajax/)로 설정한다. – Yoshi

+1

이것은 범위 지정의 간단한 문제가 아닙니다. AJAX 호출은 비동기식입니다. 여기서 일어나는 일은 1. get_users를 호출하면 Ajax 요청을 보냅니다. 이제 get_users가 완료되었습니다. 2. 가까운 장래에 AJAX 요청이 반환되고 지정한 콜백 함수가 실행됩니다 (이 경우 콜백은 특히 흥미로운 작업을 수행하지 않습니다). – Asmor

답변

2

비동기식 아약스 호출이 작동하는 방법에 대한 입문서가 필요합니다.

$.post()에 전화하면 네트워킹 호출이 시작되어 $.post() 호출에서 즉시 반환되고 나머지 자바 스크립트가 계속 실행됩니다. 즉시 기능을 종료 할 것입니다 get_users().

그러나 ajax 호출은 아직 완료되지 않았습니다. 아직 진행 중입니다. 잠시 후 ajax 호출이 끝나고 function(response) {...}으로 정의 된 ajax 호출의 성공 처리기가 호출됩니다. 그런 다음에 만 나중에 아약스 호출의 응답 값을 알 수 있습니다.

이것은 비동기식 아약스가 의미하는 것입니다. get_users()와 같은 호출을 작성하여 사용자를 확보하고 리턴 할 수는 없습니다. 대신, 나중에 (Ajax가 완료되었을 때) 호출되고 콜백 함수를 사용하여 코드의 경로를 계속 진행할 수 있어야합니다. 예,이 작업은 불편합니다. 그러나 비동기식 아약스 호출을 사용하는 자바 스크립트에서 작업하는 방식입니다. 비동기식 아약스 호출의 이점은 아약스 호출이 진행되는 동안 브라우저와 다른 자바 스크립트 코드가 완전히 살아있을 수 있다는 것입니다. 비동기 아약스 호출의 비용은 이들을 코딩하는 것이 더 복잡하다는 것입니다.

이 복잡한 문제를 처리하는 방법에는 여러 가지 선택 사항이 있습니다. 먼저 get_users() 호출을 수행 한 다음 get_users() 내부 콜백에서 수행하려는 프로그래밍 시퀀스를 계속 수행 할 수 있습니다. 그 응답 시퀀스는 응답 (실제 사용자)을 알 수있는 유일한 장소이기 때문입니다.코드에서 한 곳에서 get_users() 만 사용하는 경우 제대로 작동 할 수 있습니다. 그것은 다음과 같이 보일 것이다 : 당신이 다른 목적을 위해 여러 다른 장소에서 get_users()를 사용해야하는 경우

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 

      // process the user list here and continue whatever other code you 
      // need that deals with the user list 
     }, 
     'json' 
    ); 
} 

는, 당신은 그냥 콜백을 호출 후 호출을 콜백 자체를 가지고 수 있도록 변경할 수 있습니다 때 AJAX 호출 수행. 그런 다음 해당 콜백 함수에 응답하여 처리를 완료합니다 :

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     callback, 
     'json' 
    ); 
} 

을이 두 번째 옵션에서이 같은 get_users()를 호출 할 수 있습니다

get_users(function(response) { 
    // process the user list here and continue whatever other code you 
    // need that deals with the user list 
}); 

jQuery's deferred object를 사용 가능한 더 많은 고급 옵션이 있습니다.

5

왜 AJAX의 비동기 특성에 맞서 싸우고 있습니까? AJAX를 할 때는 순차적 코드를 작성하는 대신 이벤트 및 콜백 작업에 익숙해 져야합니다. 내부 내용을 반환 할 수 없습니다. 이것에 대한 간단한 이유는이 내부 함수가 외부 함수보다 훨씬 나중에 실행할 수 있다는 것입니다. 따라서 외부 함수는 성공 콜백이 실행되기 훨씬 전에 결과를 반환합니다.

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // instead of trying to return anything here 
      // simply do something with the response 
      // Depending on what the server sent you there 
      // will be different ways. 

      // Here you could also call some other custom function 
      // and pass it the response 
     } 
     'json' 
    ); 
} 
+0

방금 ​​배웠습니다 ... 예를 들어 주시면 감사하겠습니다. – daGrevis

+0

@da 그레이비스, 예, 답을 예를 들어 업데이트했습니다. –

3

당신은 아약스 통화에서 값을 반환 할 수 없습니다

그래서 여기에 올바른 방법입니다. 당신이 내부 수익을 칠 때까지는

을 (비동기 거짓을 설정,하지만 정말 아약스되지 않을 것없이), 외부 기능은 이미 당신은 사용자를 처리하기 위해 콜백을 사용해야합니다

을 완료했습니다.

get_users(function(response) { // this anonymous function is passed in as a parameter 
    // do something with the response 
}); 

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // call the passed in function and pass in the response as a parameter 
      callback(response);  
     }, 
     json' 
    ); 
} 
+0

* 추가 ​​작업 *이 필요하지 않으면 두 번째 익명 함수없이'callback'을 직접 사용할 수 있습니다. :) – Yoshi

관련 문제