2013-04-11 2 views
0

Firefox 확장 기능을 구축 할 때 사용자가 "확인"버튼을 눌렀을 때 Javascript 기능을 호출하는 대화 상자가 있습니다. 그 기능은 다음과 같습니다 : 나는 함수의 끝에서 경고 주석을 제거하면자바 스크립트 XMLHttpRequest Puzzler : 비동기 대 동기

var acceptSubscribeHttpReq = null; 
function acceptSubscribe(url) { 
    acceptSubscribeHttpReq = new XMLHttpRequest(); 
    acceptSubscribeHttpReq.onload = httpLoadedSubscribe; 
    acceptSubscribeHttpReq.onerror = httpErrorSubscribe; 
    try { 
     acceptSubscribeHttpReq.open("GET", url, true); 
     acceptSubscribeHttpReq.send(null); 
    } catch(e) { 
     acceptSubscribeHttpReq.abort(); 
     return false; 
    } 
    // alert("request.status = "+acceptSubscribeHttpReq.status); 
    return true; 
} 

흥미롭게도,이 내가 (false로 개방의 세 번째 인수를 설정하여) 동기식 전송을 사용하는 경우 잘 작동, 또는. 그러나 경고의 주석을 제거하지 않고 비동기를 사용하면 자동으로 실패합니다. 예상대로이 함수에서 복귀하지만 onload 핸들러는 절대 실행되지 않습니다.

이것은 함수가 종료 될 때 XMLHttpRequest 객체가 파괴되고 있음을 나타냅니다. 그 맞습니까? 이것이 버튼에서 호출되기 때문에 이런 일이 발생 했습니까? 그렇다면 가능한 해결책은 무엇입니까? 그게 아니라면 왜 이런 일이 일어날 지 생각해?

다음은 대화의 XUL입니다 :

<dialog id="winMain" title="&settingWindow.title;" style="min-width:400px;" 
    onload="initSubscribe();" ondialogaccept="return acceptSubscribe();" 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 

모든 모든 도움 감사합니다! 요청 (온로드 /의 OnError)를 완료 한 후 요청

+0

'httpErrorSubscribe' 핸들러를 호출하지 않고 어떻게 실패합니까? – Bergi

+0

@Bergi - 나 자신을 알고 싶다! 하지만 예, 비동기 전송을 수행하면 onload 또는 onerror 처리기가 실행되지 않습니다. –

답변

0

필드 상태 만이 존재한다. 요청이 완료되기 전에이 필드에 액세스하려고하면 해당 필드가 존재하지 않으므로 오류가 발생합니다.

+0

나는 그것이 사실이라고 생각하지 않는다. request.status는 송신 직후 0입니다. –

+0

그렇다면 특히 어떤 오류가 발생합니까? 추가 정보를 얻으려면'console.log (...)'코드를 추가하십시오. – jap1968