2012-02-10 1 views
1

'tjekdet'이라는 함수에서 문자열을 반환하려하지만 정의되지 않은 값을 반환하지는 않습니다. 문자열 만 반환하면 $ (this)에 결과를 추가 할 수 있습니다.jQuery는 .each()의 함수에서 정의되지 않은 문자열을 반환합니다.

이렇게하는 이유는 test2.php에 대한 요청에 약 40 초가 걸리기 때문이며, 대신에 하나씩 처리하는 것이 좋습니다. 그러나 결코 그것을 잊지 마십시오.

이것은 동기식 호출과 관련이 있습니까? 아니면 정말 기본적인 것을 완전히 놓치고 있습니까?

function tjekdet(name) { 
    $.get("test2.php", { test: name }, 
     function(data){ 
     // alert(data); returns correctly in the alert 
     return data; 
     }); 
    } 

    jQuery(function($) { 
     $('.button').live("click",function() { 
      $(".navn-list").each(function() { 
       var navn = $(this).text(); 
       var tester = tjekdet(navn); 
       alert(tester); // returns undefined 
      }); 
     }); 
+1

tjekdet의 결과는'$ .get'가 비동기 적으로 실행되기 때문에'$ .get'을 호출 한 결과가 아닐 것입니다. – osahyoun

+0

이 질문은 매일 나오지만 필자가 사본으로 닫을 필요가있을 때 나는 결코 그것을 찾을 수 없다. –

답변

4

이 동기 호출과 함께 할 수있는 뭔가가 있나요?

예. 음, 실제로는 비동기식 호출과 관련이 있습니다. tjekdet 함수는 undefined을 반환하기 전에 AJAX get이 무엇을 반환합니다.

성공 콜백 내부의 경고를 넣어 : 당신은 대신 jQuery.getjQuery.ajax를 사용하고 falseasync 옵션을 설정할 수 있습니다

$.get("test2.php", { test: name }, function(data) { 
    alert(data); 
    //Do whatever you need to do here, not in the other function 
}); 

하지만 거의 좋은 생각이 없으며까지 완전히 브라우저를 고정하는 경향이있다 데이터가 반환되었습니다.

+0

좋습니다. 고맙습니다. 그러나! 경고는 '예', '아니오', '예'등을 반환합니다.하지만 지금은 특정 div에 해당 문자열을 추가하고 싶지만 '$ (this) .append (data);'를 사용할 수 없습니다. – nielsiano

+0

나는'div'를'tjekdet' 함수에 넘길 것을 제안합니다. 그런 다음 해당 인수를 사용하여 참조 할 수 있습니다. 예를 들어'function tjekdet (elem) {...} '과 같이 입력하십시오. 함수 내에서 요소 이름을 전달하는 대신 함수의 이름을 얻을 수 있습니다. 나중에 함수를 업데이트하려면'div'에 대한 참조가 있어야합니다. –

+0

감사합니다 그것을 밖으로 시도 할 것입니다 :) – nielsiano

0

tjekdet()은 실제로 아무것도 반환하지 않기 때문에. tjekdet에있는 return 문은 실제로 익명의 콜백에 속하며 tjekdet의 반환과 아무 관련이 없습니다.

또한 tjekdet 내부의 콜백은 비동기 적으로 호출되므로 alert(tester);을 호출 할 때 아직 실행되지 않은 것일 수도 있습니다.

1

get은 특정 옵션 세트가있는 ajax의 약식입니다. AJAX는 비동기식입니다. 이는 함수가 완료 될 때 요청이 아직 반환되지 않았 음을 의미합니다.

get에서 그런 일을 반환 할 수있는 유일한 옵션은 응답을 기다리는 동안 브라우저가 중단됩니다으로, 그것을 거의 모든 경우에 나쁜 생각 인 동기 호출을 만드는 것입니다.

대신 콜백 요청의 결과와 관련된 작업을 수행해야합니다.

0

이이 코드를 같이하는 방법입니다 : 호출이 비동기입니다

function tjekdet(name, callback) { 
    $.get("test2.php", { test: name }, 
     function(data){ 
      callback(data); 
    }); 
} 

jQuery(function($) { 
    $('.button').live("click",function() { 
     $(".navn-list").each(function() { 
      var navn = $(this).text(); 
      tjekdet(navn, function(data){ 
       alert(data); 
      }); 
     }); 
    }); 
}); 

tjekdet 내부 아약스, 그 호출이 완료 될 때 어떤 조치를 실행할 수 있습니다 ...하지만 tjekdet 즉시 반환하기 때문에, 당신은 tjekdet으로부터 올바른 값을 얻을 것으로 기대할 수는 없지만 대신 콜백 메소드를 호출해야합니다.

관련 문제