HighDots Forums  

AJAX Fehler / setRequestHeader

Javascript (German) Programmiersprache JavaScript. (de.comp.lang.javascript)


Discuss AJAX Fehler / setRequestHeader in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Günter Baier
 
Posts: n/a

Default AJAX Fehler / setRequestHeader - 11-25-2007 , 12:54 PM






Hallo,

ich bekomme bei dieser Funktion manchmal einen Fehler:

uncaught exception: [Exception... "Component returned failure code:
0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f
(<unknown>)" location: "JS frame :: ....

Über Google kam ich auch schon auf diverse Hinweise, dass der Fehler
dann auftritt, wenn man versucht mehrere Requests abzuschicken, aber
nur ein XMLHTTPREQUEST-Objekt dafür hat.

Momentan erzeuge ich ein XMLHTTPREQUEST-Objekt z.B.

dataText = new create_ajaxObj();

in der Klasse create_ajaxObj() sind dann die diversen Methoden, die man
mit dataText.MethodenName() ansprechen kann.

Und bei eben einer dieser Methoden tritt bei setRequestHeader der Fehler
auf - allerdings ist es mir ein Rätsel, wie bzw. warum ich innerhalb der
Klasse nun noch ein zweites XMLHTTPREQUEST-Objekt erzeugen soll?
Und wenn ja, verliere ich dann nicht die Daten aus dem ersten Objekt?

Wahrscheinlich habe ich es noch nicht so richtig verstanden?

Für Tipps und Anregungen bin ich dankbar

Günter

Reply With Quote
  #2  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-25-2007 , 02:59 PM






Günter Baier wrote:
Quote:
ich bekomme bei dieser Funktion manchmal einen Fehler:

uncaught exception: [Exception... "Component returned failure code:
0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f
(<unknown>)" location: "JS frame :: ....

Über Google kam ich auch schon auf diverse Hinweise, dass der Fehler
dann auftritt, wenn man versucht mehrere Requests abzuschicken, aber
nur ein XMLHTTPREQUEST-Objekt dafür hat.
Du kannst den Request-Header nicht setzen, wenn mit diesem Objekt schon ein
Request läuft.

0x804B00F (0x80000000 | 0x004B0000 | 0x0000000F) ist exakt das Ergebnis von
NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS) in

http://lxr.mozilla.org/mozilla1.8/so...annel.cpp#3587

wenn mIsPending == true. nsHttpChannel::SetRequestHeader() wird von
nsXMLHttpRequest::SetRequestHeader() in

http://lxr.mozilla.org/mozilla1.8/so...quest.cpp#1706

aufgerufen.

Quote:
Momentan erzeuge ich ein XMLHTTPREQUEST-Objekt z.B.

dataText = new create_ajaxObj();

in der Klasse create_ajaxObj() sind dann die diversen Methoden, die man
^^^^^^
http://www.pseliger.de/translations/...avaScript.html

Quote:
mit dataText.MethodenName() ansprechen kann.

Und bei eben einer dieser Methoden tritt bei setRequestHeader der Fehler
auf - allerdings ist es mir ein Rätsel, wie bzw. warum ich innerhalb der
Klasse nun noch ein zweites XMLHTTPREQUEST-Objekt erzeugen soll?
Nicht innerhalb der "Klasse", sondern für das mit dem Konstruktor erstellte
Objekt.

Quote:
Und wenn ja, verliere ich dann nicht die Daten aus dem ersten Objekt?
Nicht wenn Du es richtig machst, da dann jedes Objekt separate Eigenschaften
hat.

Quote:
Wahrscheinlich habe ich es noch nicht so richtig verstanden?
Ja. Hast Du überhaupt meine Hinweise in
<news:4745DA54.3090309 (AT) PointedEars (DOT) de> berücksichtigt und den
Quelltext entsprechend korrigiert?


PointedEars
--
Der erfahrene IE-Fahrer weiß, daß man Slalom am besten im ersten Gang fährt,
weil schnelles Lenkradumreißen bei IE zum Lenkradabreißen führt. Wer
sportlich fahren will, muß Netscape fahren und hin und wieder auch mal
anschieben. ;-) --Georg Maaß, dcljs, <amuqrl$91i3q$1 (AT) ID-3551 (DOT) news.dfncis.de>


Reply With Quote
  #3  
Old   
Günter Baier
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-25-2007 , 04:45 PM



Thomas 'PointedEars' Lahn wrote:
Quote:
Wahrscheinlich habe ich es noch nicht so richtig verstanden?


Ja. Hast Du überhaupt meine Hinweise in
news:4745DA54.3090309 (AT) PointedEars (DOT) de> berücksichtigt und den
Quelltext entsprechend korrigiert?

Ich habe die Erzeugung des Requests so korrigiert.
Trotzdem brauche ich innerhalb noch das return obj; damit
die Anwendung überhaupt läuft.

Ich habe auch versucht, die Erzeugung des Requests in eine
Funktion zu packen - aber wenn ich diese dann von außen aufrufe,
dann scheint diese nicht mehr zu greifen.

var dataText = new Object();
dataText.HTTPRequest();

das scheint allerdings nicht zu klappen.

Auch in meinen anderen Funktionen hab ich das obj durch this ersetzt.
Allerdings führt das zu noch mehr Fehlern.

G. Baier


Reply With Quote
  #4  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-25-2007 , 04:55 PM



Günter Baier wrote:
Quote:
Thomas 'PointedEars' Lahn wrote:
Wahrscheinlich habe ich es noch nicht so richtig verstanden?

Ja. Hast Du überhaupt meine Hinweise in
news:4745DA54.3090309 (AT) PointedEars (DOT) de> berücksichtigt und den
Quelltext entsprechend korrigiert?

Ich habe die Erzeugung des Requests so korrigiert.
Trotzdem brauche ich innerhalb noch das return obj; damit
die Anwendung überhaupt läuft.
Nein, brauchst Du nicht, und wie schon erwähnt *darf* ein Konstruktor keinen
(solchen) Wert liefern.

Quote:
Ich habe auch versucht, die Erzeugung des Requests in eine
Funktion zu packen - aber wenn ich diese dann von außen aufrufe,
dann scheint diese nicht mehr zu greifen.

var dataText = new Object();
dataText.HTTPRequest();

das scheint allerdings nicht zu klappen.
Natürlich nicht. HTTPRequest() ist eine Methode des *Globalen* Objekts und
nicht eines beliebigen Object-Objekts.

Quote:
Auch in meinen anderen Funktionen hab ich das obj durch this ersetzt.
Allerdings führt das zu noch mehr Fehlern.
Ich habe auch keine blosse Ersetzung vorgeschlagen. Wie wäre es, wenn Du
Dich zur Abwechslung mal mit den *Grundlagen* beschäftigst, um die Lösung
zunächst zu *verstehen* oder wenigstens *konkret* *fragst*, wenn Du etwas
nicht verstehst?

http://developer.mozilla.org/en/docs/JavaScript


kopfschüttelnd,

PointedEars
--
"Use any version of Microsoft Frontpage to create your site. (This won't
prevent people from viewing your source, but no one will want to steal it.)"
Tipp gegen Quellcode-Klau <http://www.vortex-webdesign.com/help/hidesource.htm>


Reply With Quote
  #5  
Old   
Günter Baier
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-25-2007 , 05:26 PM



Thomas 'PointedEars' Lahn wrote:
Quote:
Ich habe auch keine blosse Ersetzung vorgeschlagen. Wie wäre es, wenn Du
Dich zur Abwechslung mal mit den *Grundlagen* beschäftigst, um die Lösung
zunächst zu *verstehen* oder wenigstens *konkret* *fragst*, wenn Du etwas
nicht verstehst?

http://developer.mozilla.org/en/docs/JavaScript


kopfschüttelnd,

Wo unter anderem auch wieder diese verkürzte Variante steht?

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}




Also frage ich weiter und versuche es nach und nach zu verstehen:
momentan ist der Stand folgender:

function ajaxObj()
{
var ajaxObj = this;

ajaxObj.createRequest = function()
{
if (/\b(function|object)\b/i.test(typeof XMLHttpRequest) &&
XMLHttpRequest)
{
// try..catch wird nicht universell unterstützt, ist aber hier
// möglicherweise notwendig
try
{
this.ajaxObj = new XMLHttpRequest();
}
catch (e) {}
}
else if(/\b(function|object)\b/i.test(typeof ActiveXObject) &&
ActiveXObject)
{
// s.o.; try..catch ist hier notwendig
try
{
this.ajaxObj = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}


ajaxObj.loadUserData = function(userID,file,thisName)
{
loadWait(thisName);
this.open('POST', file, true);
this.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
this.onreadystatechange = function()
{
this.handleResponseObj(thisName,'');
}
this.send('userID='+userID);
}

}


In der HTML-Datei steht:

var data = new ajaxObj();
data.createRequest();


createRequest habe ich in eine Funktion gepackt um auch innerhalb des
Objektes noch einen neuen Request zu starten - ist es das, was Du meintest?

Allerdings bekomme ich nun bei der Zeile
this.open('POST', file, true);
die Fehlermeldung "this.open is not a function"


Danke

Günter




Reply With Quote
  #6  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-25-2007 , 05:57 PM



Günter Baier wrote:
Quote:
Thomas 'PointedEars' Lahn wrote:
Ich habe auch keine blosse Ersetzung vorgeschlagen. Wie wäre es, wenn Du
Dich zur Abwechslung mal mit den *Grundlagen* beschäftigst, um die Lösung
zunächst zu *verstehen* oder wenigstens *konkret* *fragst*, wenn Du etwas
nicht verstehst?

http://developer.mozilla.org/en/docs/JavaScript


kopfschüttelnd,

Wo unter anderem auch wieder diese verkürzte Variante steht?

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
Ja, das sollte Mann[tm] vielleicht mal verbessern. Wenigstens wird dort
keine fehlgeleitete Browsererkennung verwendet so wie in dem Code, den Du
anfangs gepostet hattest.

Quote:
Also frage ich weiter und versuche es nach und nach zu verstehen:
momentan ist der Stand folgender:

function ajaxObj()
Wie schon erwähnt ist das ein Konstruktor, dem sollte daher mit einem von
anderen Methoden unterscheidbaren Bezeichner Rechnung getragen werden.

Quote:
{
var ajaxObj = this;
Überflüssig bis fhclas. `ajaxObj' ist doch bereits der Bezeichner des
Konstruktors! Du hast es lediglich der Scope Chain zu verdanken, dass
nachfolgend nicht der Konstruktor referenziert wird, da das lokale
Variablenobjekt eine gleichlautende Eigenschaft erhält.

Quote:
ajaxObj.createRequest = function()
this.createRequest = ...

Aber wie schon gezeigt würde ich Methoden mit statischem Code (nicht zu
velwechsern mit statischen Methoden, die es so in JS/ES nicht gibt) in das
Prototyp-Objekt auslagern, damit alle ajaxObj-Objekte über die Prototype
Chain denselben Code verwenden. Das Function-Objekt muss dann nicht mehr
bei *jedem* Konstruktoraufruf erzeugt und zugewiesen werden, was der
Laufzeit- und Speichereffizienz zugute kommt.

Quote:
{
[...]
this.ajaxObj = new XMLHttpRequest();
Das kann so nicht funktionieren. `this' ist bei Methoden die Referenz zum
aufrufenden Objekt, in diesem Fall eines ajaxObj-Objekts. Du fügst diesem
Objekt also eine ajaxObj-*Eigenschaft* hinzu. So weit, so schlecht (da
fehlerträchtigen Mehrdeutigkeiten damit Tür und Tor geöffnet ist). Jedoch
greifst Du auf diese Eigenschaft und damit auf das damit referenzierte
XHR-Objekt in den anderen Methoden gar nicht zu:

Quote:
}
[...]
}

ajaxObj.loadUserData = function(userID,file,thisName)
{
loadWait(thisName);
this.open('POST', file, true);
`this' ist hier wieder die Referenz zum aufrufenden Objekt. Dieses Objekt
ist Dein *benutzerdefiniertes* Objekt, _nicht_ das gekapselte XHR-Objekt.
Jenes Objekt hat folglich auch keine open-Methode,

Quote:
this.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
keine setRequestHeader-Methode,

Quote:
this.onreadystatechange = function()
{
this.handleResponseObj(thisName,'');
}
keinen onreadystatechange-Handler,

Quote:
this.send('userID='+userID);
und keine send-Methode.

Quote:
}

}


In der HTML-Datei steht:

var data = new ajaxObj();
data.createRequest();


createRequest habe ich in eine Funktion gepackt um auch innerhalb des
Objektes noch einen neuen Request zu starten - ist es das, was Du meintest?
Nein. createRequest() ist AFAIK überflüssig, weil IXHR:pen() reicht, um
mit demselben Objekt einen neuen Request auszulösen (vorausgesetzt die
Verarbeitung der Response des vorherigen ist abgeschlossen); und das
passiert ja schon in loadUserData(). Deshalb habe ich schon im Konstruktor
das Objekt erzeugt und die Referenz dorthin in der Eigenschaft `request'
gespeichert, die dann in den Methoden wiederverwendet wird.

Für einen weiteren *unabhängigen* Request erstellt man dann einfach ein
weiteres benutzerdefiniertes Objekt durch erneuten Konstruktoraufruf in
einer weiteren Zuweisung.

Quote:
Allerdings bekomme ich nun bei der Zeile
this.open('POST', file, true);
die Fehlermeldung "this.open is not a function"
Na lego, siehe oben. Schau Dir nochmal meinen Quelltext in Ruhe an und
vergleiche mit Deinem.


PointedEars
--
Nimm VerBrecherSCRIPT, denn das ist kein JavaScript-Objekt, wird also bei
keinem vernünftigen Browser geschweige denn auf einer vernünftigen Plattform
funktionieren, so daß Du auch [...] gleich mit VBSCRIPT arbeiten kannst und
dies auch tun solltest. --Georg Maaß, <ao3k78$ije4r$3 (AT) ID-3551 (DOT) news.dfncis.de>


Reply With Quote
  #7  
Old   
Günter Baier
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-26-2007 , 02:19 AM



Thomas 'PointedEars' Lahn wrote:
Quote:
Na lego, siehe oben. Schau Dir nochmal meinen Quelltext in Ruhe an und
vergleiche mit Deinem.

Ok, danke erst einmal für Deine ausführlichen Erklärungen.
Ich denke, ich bin schon etwas weitergekommen, auch wenn es noch nicht
ganz funktioniert:

function ajaxObj()
{
if (/\b(function|object)\b/i.test(typeof XMLHttpRequest) &&
XMLHttpRequest)
{
// try..catch wird nicht universell unterstützt, ist aber hier
// möglicherweise notwendig
try
{
this.request = new XMLHttpRequest();
}
catch (e) {}
}
else if(/\b(function|object)\b/i.test(typeof ActiveXObject) &&
ActiveXObject)
{
// s.o.; try..catch ist hier notwendig
try
{
this.request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}

ajaxObj.prototype = {
constructor: ajaxObj,
request: null,

loadUserData: function (userID,file,thisName)
{
var req = this.request;

loadWait(thisName);
req.open('POST', file, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

req.onreadystatechange = function()
{
this.handleResponseObj(req,thisName,'');
}
req.send('userID='+userID);
},

handleResponseObj: function(req,thisName)
{
var req = this.request;
if(req.readyState == 4)
{
document.getElementById(thisName).innerHTML = req.responseText;
}
}

}


Prinzipiell scheint es jetzt zu funktionieren, bis auf den Aufruf der
Funktion handleResponseObj() in loadUserData ... da bekomme ich
allerdings auch keine Fehlermeldung.

Wo lieg hier noch der Fehler begraben?

Danke

Günter




Reply With Quote
  #8  
Old   
Günter Baier
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-26-2007 , 10:02 AM



Günter Baier wrote:
Quote:
loadUserData: function (userID,file,thisName)
{
var req = this.request;

loadWait(thisName);
req.open('POST', file, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

req.onreadystatechange = function()
{
this.handleResponseObj(req,thisName,'');
}
req.send('userID='+userID);
},

handleResponseObj: function(req,thisName)
{
var req = this.request;
if(req.readyState == 4)
{
document.getElementById(thisName).innerHTML = req.responseText;
}
}

}


Prinzipiell scheint es jetzt zu funktionieren, bis auf den Aufruf der
Funktion handleResponseObj() in loadUserData ... da bekomme ich
allerdings auch keine Fehlermeldung.


Ah, doch ... this.handleResponseObj is not a function ??????
Wieso das - ist doch auch so eingebunden, wie loadUserData?

Günter


Reply With Quote
  #9  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-26-2007 , 02:59 PM



Günter Baier wrote:
Quote:
Günter Baier wrote:
loadUserData: function (userID,file,thisName)
{
var req = this.request;

loadWait(thisName);
req.open('POST', file, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

req.onreadystatechange = function()
{
this.handleResponseObj(req,thisName,'');
}
req.send('userID='+userID);
},

handleResponseObj: function(req,thisName)
{
var req = this.request;
if(req.readyState == 4)
{
document.getElementById(thisName).innerHTML = req.responseText;
}
}

[...]
Prinzipiell scheint es jetzt zu funktionieren, bis auf den Aufruf der
Funktion handleResponseObj() in loadUserData ... da bekomme ich
allerdings auch keine Fehlermeldung.


Ah, doch ... this.handleResponseObj is not a function ??????
Wieso das - ist doch auch so eingebunden, wie loadUserData?
Während im MSXML-DOM `this' innerhalb des onreadystatechange-Listeners
auf das XHR-Objekt verweist, verweist es im Gecko-DOM auf den Listener.
In jedem Fall kann es deshalb so nicht funktionieren. Mit der Closure

var me = this;
req.onreadystatechange = function()
{
me.handleResponseObj(req,thisName,'');
}

geht es. Sorry, mein Fehler.


PointedEars


Reply With Quote
  #10  
Old   
Günter Baier
 
Posts: n/a

Default Re: AJAX Fehler / setRequestHeader - 11-26-2007 , 03:09 PM



Thomas 'PointedEars' Lahn wrote:
Quote:
Während im MSXML-DOM `this' innerhalb des onreadystatechange-Listeners
auf das XHR-Objekt verweist, verweist es im Gecko-DOM auf den Listener.
In jedem Fall kann es deshalb so nicht funktionieren. Mit der Closure

var me = this;
req.onreadystatechange = function()
{
me.handleResponseObj(req,thisName,'');
}

geht es. Sorry, mein Fehler.

Hmm, ich habe es gerade so gelöst, in dem ich diese Funktion dann mit

ajaxObj.prototype.handleResponseObj

aufrufe. Ist das eher falsch oder nur eine verlängerte Schreibweise?

Momentan versuche ich nun gerade diesen setRequestHeader-Fehler
zu umschiffen, im dem ich einen zweiten Request starte - das sollte doch
mit einem erneuten

new ajaxObj();

funktionieren - aber auch innerhalb der Funktionen?

Günter


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.