在构建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