ugrás a tartalomhoz

Ajax összeakadás

gtoma · 2012. Okt. 13. (Szo), 10.58
Sziasztok!

Egy elég bonyolult js problémám akadt, és nem jövök rá a megoldásra. Gugli a barátom volt, de nem segített ő sem. :) Így jutottam hozzátok, hátha valaki tudja a megoldást, és hajlandó segíteni. :)

A helyzet összefoglalója:
Linkre kattintva indul egy ajax lekérés. Háttérbe PUSH() -al kinyomom az aktuális "állapotot", amit egy divbe pakolgatok. A kapcsolat hosszabb távon fennál, és több PUSH()-al érkezik válasz. Minden szépen működik (ff alatt nézem még csak).

Azonban ha a PUSH() folyamán újra el akarom indítani az ajax lekérést (vagyis egy újat akarok), akkor összeakadnak a lekérések. Azaz, a "második szálba" érkező válasz belekerül az első szálba is. Teszi ezt annak ellenére, hogy a script tag printelése után a php egyből leáll.

Sajnos js ből nem vagyok túl erős, de az a gyanúm, hogy valami változó értékének öröklődését nem vettem figyelembe.

Íme a kód:
  1. function AjaxObj(COM) {  
  2.     var Command = COM;  
  3.       
  4.     function StartF(myValue){          
  5.         var myPars = 'com='+Command+'&'+myValue;  
  6.         var url = BasicURL+"/web2cms/extrmoduls/importmotor.php";  
  7.         new makeRequest(url, myPars);         
  8.     }  
  9.     this.Start = StartF;  
  10. }  
  11.   
  12. function makeRequest(url, parameters) {  
  13.     var http_request = false;  
  14.     this.textem = textem;  
  15.     this.tartalekhosz = 0;  
  16.       
  17.     if (window.XMLHttpRequest) { // Mozilla, Safari,...  
  18.         http_request = new XMLHttpRequest();  
  19.   
  20.         if (http_request.overrideMimeType) {  
  21.                 http_request.overrideMimeType('text/xml');  
  22.         }  
  23.     } else if (window.ActiveXObject) { // IE  
  24.         try {  
  25.                 http_request = new ActiveXObject("Msxml2.XMLHTTP");  
  26.         } catch (e) {  
  27.             try {  
  28.                 http_request = new ActiveXObject("Microsoft.XMLHTTP");  
  29.             } catch (e) {}  
  30.         }  
  31.     }  
  32.     if (!http_request) {  
  33.         alert('Hiba :( Nem hozható létre az XMLHTTP példánya');  
  34.         return false;  
  35.     }  
  36.   
  37.     http_request.onreadystatechange = function() {  
  38.         if(this.tartalekhossz == undefined) { this.tartalekhossz = 0; }  
  39.         if (http_request.readyState == 4) {  
  40.             if (http_request.status == 200) {  
  41.                     // Úgy tűnik ez nem kell, mert megcsinálja az else ág...  
  42.                     http_request = false;  
  43.             } else {  
  44.                     alert('Hiba történt a kérés kiszolgálása során.');  
  45.                     http_request = false;  
  46.             }  
  47.         } else {  
  48.             this.hossz = http_request.responseText.length;              
  49.             textem = http_request.responseText;  
  50.             textem = textem.substring(this.tartalekhossz);  
  51.             this.tartalekhossz = this.hossz;  
  52.             //alert('hossz:'+this.tartalekhossz+';textem:'+textem);  
  53.             RespControll(textem);  
  54.         }  
  55.     };  
  56.     http_request.open('POST', url, true);  
  57.     http_request.setRequestHeader('Content-Type''application/x-www-form-urlencoded');  
  58.     http_request.send(parameters);  
  59. }  
  60.   
  61. function RespControll(Resp) {  
  62.     re = /(?:<id\:([^>]*)?>)((\n|\r|.)*?)(?:<\/id>)/ig;  
  63.     while((match = re.exec(Resp))){  
  64.         helyzet = match[1].split(':');  
  65.         id = helyzet[0];  
  66.         hely = helyzet[1];  
  67.         mit = match[2];  
  68.   
  69.         switch(hely) {  
  70.             case 'top':  
  71.                 new Insertion.Top(id, mit);  
  72.                 break;  
  73.             case 'bottom':  
  74.                 new Insertion.Bottom(id, mit);  
  75.                 break;  
  76.             case 'before':  
  77.                 new Insertion.Before(id, mit);  
  78.                 break;  
  79.             case 'after':  
  80.                 new Insertion.After(id, mit);  
  81.                 break;  
  82.             default:  
  83.                 $(id).innerHTML = mit;  
  84.         }  
  85.   
  86.     }  
  87.     mcEval(Resp);  
  88. }  
  89.   
  90. function mcEval(string) {  
  91.     re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;  
  92.     while((match = re.exec(string))){  
  93.         eval(match[2]);  
  94.     }      
  95. }  
A HTML rész:
  1. <a href="javascript:akarmi.Start('sor=0');">Teszt</a>  
  2. <script type="text/javascript">  
  3.      akarmi = new AjaxObj('teszt');  
  4. </script>  
Esetleg a php:
  1. if($_POST['com'] == 'teszt') TesztKeret();  
  2. function TesztKeret() {  
  3.     teszt(1);  
  4.     teszt(2);      
  5.     teszt(3);  
  6.   
  7.     if($_POST['sor'] < 30) {  
  8.         print '  
  9.         <script>  
  10.         alert("várakoztatás");  
  11.         akarmi.Start("sor=40");  
  12.         </script>';  
  13.     }  
  14.     exit;  
  15. }  
  16.   
  17. function teszt($x) {      
  18.     for($i=0; $i<15000000; $i++) { }  
  19.     print '<id:adatok:felulir>'.$_POST['sor'].': '.$x.'</id>';  
  20.     print '<id:lista:after>'.$x.'</id>';      
  21.     flush();  
  22. }  
Az alábbi oldalon rá lehet nézni:
http://www.smokingtrade.hu/web2cms/extrmoduls/index.html
 
1

Mi a cél?

Poetro · 2012. Okt. 13. (Szo), 12.09
Egyáltalán mi a cél? Miért hívogatod meg a szkriptedet rekurzívan? És ha már vársz egy sor nevű változóra, akkor miért nem küldöd el? Valamint az is hasznos lenne, ha deklarálnád a változókat, és nem mindegyik globális lenne, mert az is okozhat problémát.
2

Egyszerű, de nem segít. :)

gtoma · 2012. Okt. 13. (Szo), 13.21
A cél az, hogy pl egy termék importnál, ha kifut a futási időből a php, akkor "meg tudja hívni" saját magát. A folyamatos push() pedig a folyamatos tájékoztatás miatt szükséges (én biztosan igénylem :) )

(sajnos a push() feldolgozásra jqueryben nem találtam megoldást, pedig ott talán nem szívnék ezzel)

A kód sajnos tényleg nem a "normál volt".

javítottam a megadott linken.

function makeRequest(url, parameters) { ... } Ő nem kap, csak 2 változót.

Azért raktam bele a +változót, mert azt gondoltam, hogy a StartF függvényben minden alkalommal ÚJ lekérés készül, és gondoltam, hogy talán a textem változó miatt van gond. Azóta kétlem, mert a firebugban is megjelenik a 2. lekérés tartalma az első szálban.

Melyik változót, és hol kellene deklarálnom? Kifejtenéd?
3

JavaScriptben

Poetro · 2012. Okt. 13. (Szo), 13.23
JavaScriptben minden változót deklarálni kell a var kulcsszóval, különben globális változó lesz, amit használsz. Ennek okán például a re, textem, helyzet, id, match stb. globális változók, és minden egyes futás felül írja a másik változót.
4

2 nap legszebb pillanata

gtoma · 2012. Okt. 13. (Szo), 13.32
SIKERÜLT! KÖSZÖNÖM!

két napot szívtam vele legalább, ha nem többet. Bemásolom az új kódot, amivel működik, véleményed szerint melyikkel lehetett a gáz?
  1. function makeRequest(url, parameters) {  
  2.     var http_request = false;  
  3.     var textem = '';  
  4.     this.hossz = 0;  
  5.     this.tartalekhossz = 0;  
  6.       
  7.     if (window.XMLHttpRequest) { // Mozilla, Safari,...  
  8.         http_request = new XMLHttpRequest();  
  9.   
  10.         if (http_request.overrideMimeType) {  
  11.                 http_request.overrideMimeType('text/xml');  
  12.         }  
  13.     } else if (window.ActiveXObject) { // IE  
  14.         try {  
  15.                 http_request = new ActiveXObject("Msxml2.XMLHTTP");  
  16.         } catch (e) {  
  17.             try {  
  18.                 http_request = new ActiveXObject("Microsoft.XMLHTTP");  
  19.             } catch (e) {}  
  20.         }  
  21.     }  
  22.     if (!http_request) {  
  23.         alert('Hiba :( Nem hozható létre az XMLHTTP példánya');  
  24.         return false;  
  25.     }  
  26.   
  27.     http_request.onreadystatechange = function() {  
  28.         if(this.tartalekhossz == undefined) { this.tartalekhossz = 0; }  
  29.         if (http_request.readyState == 4) {  
  30.             if (http_request.status == 200) {  
  31.                     // Úgy tűnik ez nem kell, mert megcsinálja az else ág...  
  32.                     http_request = false;  
  33.             } else {  
  34.                     alert('Hiba történt a kérés kiszolgálása során.');  
  35.                     http_request = false;  
  36.             }  
  37.         } else {  
  38.             this.hossz = http_request.responseText.length;              
  39.             textem = http_request.responseText;  
  40.             textem = textem.substring(this.tartalekhossz);  
  41.             this.tartalekhossz = this.hossz;  
  42.             //alert('hossz:'+this.tartalekhossz+';textem:'+textem);  
  43.             RespControll(textem);  
  44.         }  
  45.     };  
  46.     http_request.open('POST', url, true);  
  47.     http_request.setRequestHeader('Content-Type''application/x-www-form-urlencoded');  
  48.     http_request.send(parameters);  
  49. }  
  50.   
  51. function RespControll(Resp) {  
  52.     var re = /(?:<id\:([^>]*)?>)((\n|\r|.)*?)(?:<\/id>)/ig;  
  53.     while((match = re.exec(Resp))){  
  54.         var helyzet = match[1].split(':');  
  55.         var id = helyzet[0];  
  56.         var hely = helyzet[1];  
  57.         var mit = match[2];  
  58.   
  59.         switch(hely) {  
  60.             case 'top':  
  61.                 new Insertion.Top(id, mit);  
  62.                 break;  
  63.             case 'bottom':  
  64.                 new Insertion.Bottom(id, mit);  
  65.                 break;  
  66.             case 'before':  
  67.                 new Insertion.Before(id, mit);  
  68.                 break;  
  69.             case 'after':  
  70.                 new Insertion.After(id, mit);  
  71.                 break;  
  72.             default:  
  73.                 $(id).innerHTML = mit;  
  74.         }  
  75.   
  76.     }  
  77.     mcEval(Resp);  
  78. }  
  79.   
  80. function mcEval(string) {  
  81.     var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;  
  82.     while((match = re.exec(string))){  
  83.         eval(match[2]);  
  84.     }      
  85. }