Javascript XMLHttpRequest Puzzler:异步与同步
在构建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#">
任何和所有帮助表示赞赏!
该字段状态请求只有在请求完成(onload/onerror)后才存在。如果您在请求完成之前尝试访问此字段,则会出现错误,因为此字段不存在。
我不认为这是真的。发送后,request.status立即为零。 – 2013-04-11 21:16:04
如果是这样,特别是您遇到的错误是什么?尝试添加一些'console.log(...)'代码来获取更多信息。 – jap1968 2013-04-12 09:49:06
它没有调用你的'httpErrorSubscribe'处理程序会失败吗? – Bergi 2013-04-11 17:43:36
@Bergi - 我想知道我自己!但是,是的,如果我进行异步发送,onload或onerror处理程序都不会执行。 – 2013-04-11 21:15:32