2016-05-09 4 views
3

Этот код работает отлично:Порядок XMLHttpRequest очень важен?

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 (метод, URL, истина) на другую позицию и xhttp. onreadystatechange никогда не называется. Проверено с Firefox 45.0.2 и IE 11, и я считаю, что это не имеет никакого отношения к Flash-плееру. Приказ не должен влиять на все это, не так ли?

ответ

4

Порядок методов абсолютно важен с XMLHttpRequest. description of open начинается с:

Инициализирует запрос. Этот метод должен использоваться из кода JavaScript; для инициализации запроса из собственного кода используйте вместо него openRequest().

До open было названо, просьба не полностью инициализирован (выделение не инициализации, здесь) и другие методы не гарантируется правильная работа.

От некоторых the examples in the WhatWG spec, onreadystatechange должно работать, но я не могу представить setRequestHeader. На самом деле, называя setRequestHeader перед open должен бросить InvalidStateError, it seems:

Если состояние не ОТКРЫТ, бросить «InvalidStateError» исключение.

+0

ОК, поэтому я могу установить заголовок запроса только для «открытого» XMLHttpRequest. Weird. – darwinjob