2013-04-11 95 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