2010-12-11 8 views
2

다음 스 니펫이 있습니다.자바 스크립트를 통해 'Content-Length'를 얻으려면 어떻게해야합니까?

var size; 
function getImageSize(url) 
{ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('HEAD', url, true); 
    xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4) 
     { 
      if (xhr.status == 200) 
      { 
       size = xhr.getResponseHeader('Content-Length'); 
       alert(size); 
      } 
     } 
    }; 
    xhr.send(null); 
    return size; 
} 

이 함수의 목적은 파일 크기 (이미지)를 반환하는 것입니다.

함수 내부의 경고는 항상 올바른 값을 반환하지만 함수 자체는 항상 undefined을 반환합니다. 왜?

Odly, 내가 파이어 버그로 디버깅하면, 함수는 항상 올바르게 돌아올 것입니다 ...

+0

가능한 한 이미지의 크기를 반환 할 수있는 아약스 호출을 만들면 크기를 알기 위해 네트워크를 통해 전송할 필요가 없지만 문제는 여전히 운동으로 유효합니다. –

답변

3

. 즉 비동기 적으로 실행됩니다. 콜백 함수를 대신 전달하고 size 인수로 적용하고 싶습니다.

+0

나는 그 생각 ... 날짜 개체를 사용하여 반환하기 전에 5 초 기다리는 기능을했습니다. 여전히 undefined가 반환됩니다. – srcspider

+0

@srcspider'size'를 반환하지 않습니다 (항상 정의되지 않습니다). 대신, AJAX 콜백 내에서 호출되는 getImageSize에 대한 콜백을 전달하십시오 * 여기서 content-length를 읽습니다. 크기를 콜백의 인수로 전달하십시오. 또 다른 접근법은 * synchronous * AJAX 요청을 사용하는 것입니다.하지만 블록킹되고 응답하지 않는 해결책으로 이어질 수 있으므로 일반적으로 권장하지 않습니다. –

+2

@srcspider : [jQuery] (http://jquery.com)가 흥미로울 수 있습니다. [jQuery.ajax()] (http://api.jquery.com/jQuery.ajax/) 함수를 자세히 살펴보십시오. 응답이 반환되었을 때 실행될 콜백 함수를 전달할 수있는'success' 옵션이 있습니다. jQuery는 더 많은 장점도 제공한다. 그것을 확인해보십시오 :) – BalusC

1

코드 순서 문제가 있습니다. 코드는 동기식이 아니며 비동기식입니다.

콜백은 미래에 발생하지만 반품은 곧바로 발생합니다.

Firebug에서 디버깅 결과가 올바른 결과를 반환하는 이유는 반환되기 전에 콜백이 실행되기까지 코드가 오랫동안 느려지 기 때문입니다.

관련 문제