2010-05-19 3 views
2

$ .post() 함수에서 검색 한 데이터를 내 코드의 다른 위치에서 사용하는 데 문제가 있습니다. 데이터를 변수로 저장하고 post() 함수 외부에서 사용하려고합니다. 내 코드 :

var last_update = function() { 
$.post('/--/feed', 
{func:'latest', who:$.defaults.login}, 
function($j){ 
      _j = JSON.parse($j);  
      alert(_j.text); // This one works  
     }); 
} 
alert(_j.text); // This one doesn't 
}; 

last_update(); //run the function 

도와주세요!

+0

두 번째 경고에서'_j'는'undefined '이므로'_j.text'가'undefined'에있는 속성에 접근하려고 시도하고 있습니다. 실패합니다. AJAX 콜백 외부에 코드를 배치하는 대신 코드를 실행해야 할 필요가 있습니까? – user113716

답변

1

아약스 요청 콜백 외부의 데이터 값에 액세스하려면 해당 코드를 함수에 넣고 success 콜백에서 호출해야합니다.

var last_update = function() { 
$.post('/--/feed', 
{func:'latest', who:$.defaults.login}, 
function($j){ 
      _j = JSON.parse($j);  
      alert(_j.text); // This one works 
      someOtherFunc(_j.text); 
     }); 
} 
}; 

last_update(); //run the function 

function someOtherFunc(val) { 
    alert(val) 
} 
콜백의 코드를 배치 본질적으로 동일

,하지만 당신은 다른 곳에서 재사용되는 코드의 비트가있는 경우 유용 할 수 있습니다.

+0

감사합니다. –

+0

@James Bao - 오신 것을 환영합니다. 다행입니다. – user113716

-1

last_update 기능의 범위에 _j을 작성하십시오.

+0

_j는 글로벌처럼 보입니다. 그러나 문제는 범위가 아닌 비동기 성질입니다. –

+0

그의 질문은 _j를 클로저 변수로 만드는 방법이라고 생각했습니다. –

+0

그런 다음 질문을 자세히 읽지 않았습니다. –

3

$.post() AJAX 호출은 비동기식입니다. 즉, AJAX 요청은 평상시 프로그램 실행 순서가 잘못되어 프로그램에서 _j가 채워지기 전에 두 번째 경고가 호출됨을 의미합니다. 실행 순서는 다음과 같습니다

  1. 전화 last_update()
  2. 가, 아약스 요청을 콜백 함수를 실행하기 위해 기억하지만 지금은
  3. 호출 두 번째 경고 (_j.text); 성공의 기능은 무엇이라고 -
  4. 아약스 요청 데이터를 반환은, 콜백 함수를

이동 (여기 리턴 기능 function($j) 임) success() 함수에 AJAX 반환 데이터를 사용하는 코드를 실행할 때 .

$.post()$.ajax() (전체 문서 here)의 별칭입니다.

+0

감사합니다. 내가 알고 싶은 것은 success 함수 외부에서 반환 된 데이터를 사용하는 방법입니다. 어떤 제안? –

+0

AJAX 반환 데이터를 사용하는 코드를'success()'함수로 옮겨야합니다 - 그 단계까지는 데이터가 스크립트에 반환되지 않습니다. – Andy

0

당신은 당신의 POST 요청 동기를 만들어 글로벌 _j 변수 수 :

// global!!! 
var _j; 

$.ajax({ 
    async: false, 
    url: '/--/feed', 
    data: { func:'latest', who:$.defaults.login }, 
    success: function($j) { 
    _j = JSON.parse($j);  
    alert(_j.text); // This one works 
    } 
}); 

function last_update() { 
    if (typeof _j != 'undefined') { 
    alert(_j); 
    } 
} 

을 또는 당신은 단순히 비동기하여 더 이상 필요, 당신의 성공 콜백 내에서 last_update()를 호출 할 수 없었다 :

$.ajax({ 
    url: '/--/feed', 
    data: { func:'latest', who:$.defaults.login }, 
    success: function($j) { 
    _j = JSON.parse($j);  
    alert(_j.text); // This one works 
    last_update(_j); 
    } 
}); 

function last_update(_j) { 
    alert(_j); 
} 
관련 문제