Javascript XMLHttpRequest Puzzler:异步与同步

时间:2013-04-11 17:37:51

标签: javascript asynchronous xmlhttprequest firefox-addon

在构建Firefox扩展时,我有一个对话框,当用户点击“确定”按钮时,该对话框会调用Javascript函数。该功能如下所示:

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;
 }

有趣的是,如果我使用同步发送(通过将open的第三个参数设置为false),或者如果我在函数末尾取消注释警报,则此方法可以正常工作。但是,如果我在不取消注释警报的情况下使用异步,那么这将无声地失败 - 我按照预期返回此函数,但是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#">

任何和所有帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

请求的字段 status 仅在请求完成后存在(onload / onerror)。如果您在请求完成之前尝试访问此字段,则会出现错误,因为此字段不存在。