在構建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#">
任何和所有幫助表示讚賞!
它沒有調用你的'httpErrorSubscribe'處理程序會失敗嗎? – Bergi 2013-04-11 17:43:36
@Bergi - 我想知道我自己!但是,是的,如果我進行異步發送,onload或onerror處理程序都不會執行。 – 2013-04-11 21:15:32