2013-04-11 150 views
0

在構建Firefox擴展時,我有一個對話框,當用戶點擊「確定」按鈕時調用Javascript函數。這個功能看起來是這樣的: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; 
} 

有趣的是,如果我用一個同步發送(通過設置開放給假的第三個參數)這工作正常,或者如果我在函數的末尾取消註釋警報。但是,如果我使用異步而不取消註釋警報,那麼這會失敗 - 我按預期從此函數返回,但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#"> 

任何和所有幫助表示讚賞!

+0

它沒有調用你的'httpErrorSubscribe'處理程序會失敗嗎? – Bergi 2013-04-11 17:43:36

+0

@Bergi - 我想知道我自己!但是,是的,如果我進行異步發送,onload或onerror處理程序都不會執行。 – 2013-04-11 21:15:32

回答

0

該字段狀態請求只有在請求完成(onload/onerror)後才存在。如果您在請求完成之前嘗試訪問此字段,則會出現錯誤,因爲此字段不存在。

+0

我不認爲這是真的。發送後,request.status立即爲零。 – 2013-04-11 21:16:04

+0

如果是這樣,特別是您遇到的錯誤是什麼?嘗試添加一些'console.log(...)'代碼來獲取更多信息。 – jap1968 2013-04-12 09:49:06