2015-02-15 9 views
9

Il codice -XMLHttpRequest gettando InvalidSateError dicendo "stato oggetto deve essere aperto"

"use strict"; 

var AJAX = function (params) { 
    this.server ={}; 
    this.url = params.url; 
    this.method = params.method; 
    this.dataType = params.dataType; 
    this.formData = params.formData; 

    this.init = function(){ 
     if(typeof XMLHttpRequest != 'undefined'){ 
      this.server = new XMLHttpRequest(); 
      this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      this.server.setRequestHeader('Content-length', this.formData.length); 
      this.server.setRequestHeader('Connection', 'close'); 
      console.log("XMLHttpRequest created."); 
      return true; 
     } 
    }; 

    this.send = function(){ 
     if(this.init()){ 
      this.server.open(this.method, this.url, true); 
      this.server.send(this.formData); 
     } 
    }; 

}; 

Si sta gettando seguente errore:

Error in event handler for contextMenus: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. 

Come è in uso -

var data = new FormData(); 

data.append('user', 'sachin'); 
var params = { 
    url : 'example.com', 
    method : 'post', 
    dataType: 'json', 
    formData : data 
}; 

var backgroundWindow = chrome.extension.getBackgroundPage(); 

var ajax = new backgroundWindow.AJAX(params); 

ajax.send(); 

Non riesco a sembrare capire qual è la ragione dietro.

risposta

19

L'errore è semplice:

Error in event handler for contextMenus: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.

è necessario chiamare .open(..) prima di impostare le intestazioni di richiesta.



Dato il codice, credo che il modo migliore sarebbe quello di spostare la chiamata per aprire nella funzione init(..).

var AJAX = function (params) { 
    this.server ={}; 
    this.url = params.url; 
    this.method = params.method; 
    this.dataType = params.dataType; 
    this.formData = params.formData; 

    this.init = function(){ 
     if(typeof XMLHttpRequest != 'undefined'){ 
      this.server = new XMLHttpRequest(); 

      //Open first, before setting the request headers. 
      this.server.open(this.method, this.url, true); 

      //Now set the request headers. 
      this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      //this.server.setRequestHeader('Content-length', this.formData.length); 
      //this.server.setRequestHeader('Connection', 'close'); 
      console.log("XMLHttpRequest created."); 
      return true; 
     } 
    }; 

    this.send = function(){ 
     if(this.init()){ 
      this.server.send(this.formData); 
     } 
    }; 

}; 
+0

Sì. È ovvio. :) Silly me non legge correttamente l'errore. Grazie . – SachinGutte

+0

Un'altra cosa da aggiungere, devo rimuovere intestazioni 'Content-Length' e' Connection'. Il browser si occupa di questo. Ma dove possono essere usati? – SachinGutte

+0

Corretto, il browser si occupa di quelle due intestazioni. Non dovresti specificarli. Se capisco correttamente la tua domanda, non devono essere utilizzati ovunque. – SuperSaiyan

2

Probabilmente è necessario aprire la connessione dopo la chiamata XMLHttpRequest e prima della setRequestHeader chiamata Anziché:

 this.server = new XMLHttpRequest(); 
     this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 

penso che devi fare:

 this.server = new XMLHttpRequest(); 
     this.server.open(this.method, this.url, true); 
     this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 

anche fare in modo di rimuovere questo linea nel init(), come hai fatto sopra.