XMLHttpRequest方法的顺序很重要?

时间:2016-05-09 16:02:08

标签: javascript flash xmlhttprequest call onreadystatechange

此代码可以正常工作:

function callFromFlex(url, method, payload) {
   console.log("call from Flex: " + method + " " + url + " " + payload);
   var xhttp = new XMLHttpRequest();
   xhttp.open(method, url, true);
   xhttp.setRequestHeader("Content-Type", "application/json");
   xhttp.onreadystatechange = function() {
    console.log(xhttp.readyState);
       if (xhttp.readyState == 4) { 
        console.log("trying to call flash...");
           // Callback to Flash here
           ...  
       }
   };

   xhttp.send(payload);
}

但这不会 - 从未调用onreadystatechange:

function callFromFlex(url, method, payload) {
    console.log("call from Flex: " + method + " " + url + " " + payload);
    var xhttp = new XMLHttpRequest();

    xhttp.setRequestHeader("Content-Type", "application/json");
    xhttp.onreadystatechange = function() {
        console.log(xhttp.readyState);
        if (xhttp.readyState == 4) {    
            console.log("trying to call flash...");
            // Callback to Flash here;
            ... 
        }
    };
    xhttp.open(method, url, true);
    xhttp.send(payload);
}

我刚刚将xhttp.open(method,url,true)移动到另一个位置,并且永远不会调用xhttp.onreadystatechange。检查Firefox 45.0.2和IE 11,我相信它与Flash播放器无关。订单不应该影响所有这些,是吗?

1 个答案:

答案 0 :(得分:4)

方法顺序对于XMLHttpRequest绝对重要。 description of open以:

开头
  

初始化请求。此方法将从JavaScript代码中使用;要从本机代码初始化请求,请改用openRequest()。

在调用open之前,请求未完全初始化(分配不是初始化,此处),并且其他方法无法保证正常工作。

某些the examples in the WhatWG speconreadystatechange应该有效,但我无法想象setRequestHeader会。事实上,在setRequestHeader之前致电open会引发InvalidStateErrorit seems

  

如果状态未打开,则抛出“InvalidStateError”异常。