Jump to content
php.lv forumi

ajax response korekta handlošana


Lynx

Recommended Posts

Esmu saskāries ar interesantu problēmu meiģinot izveidot advancētāku ajax response handlošanu. Parastais variants(cik es esmu pētijis tutoriāļus, lai atrisinātu jauno problēmu) ir, ka response mēs vienkārši ar innerHTML ievietojam lapā.

Izrāvums no koda:

function get(page, target) {
request = createRequest();	  
request.onreadystatechange = function(){ updatePage(request, target); }
function updatePage(request, target)	
{
 if(request.readyState == 4 && request.status == 200) 
	 { 
			  if(target = document.getElementById(target))
			   {
			   target.innerHTML = request.responseText;

Manā gadijumā šis variants vairs neder un es vēlos panākt to ka request.responseText tiek piesaistīts mainīgajam, lai funkcijas get() izsaucošā funkcija uzreiz atbildi varētu apstrādāt.

Papētiju resursus internetā un nonācu pie šādas metodes, mantojot watch funckiju:

 

 //šis te kods ir iekš augstāk minētās get()
if(request.readyState == 4 && request.status == 200) { 
global.response = response;   //atbilde tiek pielikt pie global objekta, negribēju likt zem window.  
global.request_ready = 1;  }

//talak aiz funkcijas, kas izsauc get();
global.watch("request_ready", function(){
//varam piekluut global.response un apstradaat
global.unwatch("request_ready");
global.request_ready = 0; 
});

Izskatās labi, bet ir dažas problēmas:

1) neiet uz Operas

2) pēc koda spriežot un dēļ globālo mainīgo izmantošanas šķiet, ja tiks izsaukti 2i ajax pieprasījumi paralēli rezultāti varētu sajukt vai kopā kaut kas nojukt.

 

Attiecīgi jautājums: kādu metodi Jūs izmantojat, lai apstrādātu atbildi un kāds būtu labākais variants kā šeit rīkoties lai panāktu vēlamo rezultātu?

Vēlamās idejas shēma īsumā:

1)funkcija asd() izsauc funkciju get()

2)funkcija get() veic ajax pieprasījumu sagaida atbildi un izdara savu maģiju, lai asd() varētu effektīvi saņemt datus

3)funkcija asd() saņem ajax atbildi kā mainīgo un apstradā tālāk.

Link to comment
Share on other sites

un lūk piemērs tam, ka ajax tutoriāļi ar innerHTML ir kaut kas tik pat "labs" kā php tutoriāļi ar register globals on.

 

nesapratu no šitā visa ko īsti nezini, bet tā ar dari, innerHTML vietā izsauc to f-ju kuru vajag, saņemtos datus var padod kā argumentu, varbūt nevajag nekādu globālo mainīgo.

Link to comment
Share on other sites

Hmm te arī rodas problēma meiģinot padot saņemots datus kā argumentu, jo pielīdzinot funkciju mainīgajam rezultāts ir undefined, jo dati vēl nav saņemti. Isumā piemērs šeit:

 

Response text atgriežam ar return:

function get(page) { 
request = createRequest();	  
request.onreadystatechange = function(){ updatePage(request); }
request.open("GET", page, true);
request.send(null);
function updatePage(request)	
{
if(request.readyState == 4 && request.status == 200) { return request.responseText; }

 

un funkciju izsaucam, piemēram šādi: var res = get('blabla.php');

 

rezultāts veicot alert(res) ir undefined, jo get() vēl nav atgriezis atbildi pielīdzināšanas brīdī. Tapēc ir jaizmanto kāda gaidīšanas funkcija, kas paziņo ka ajax rezultātu ir atgriezis un viņu var izmantot. Bet kā jau minēju watch() īsti labi nestrādā uz Operas uz FF viss izcili.

Link to comment
Share on other sites

Īsti nesapratu kāpēc tev neder pirmais variants? Un kāpēc vajadzīgi kautkādi globālie mainīgi..

 

Vai tik tev nevajag sinhrono pieprasījumu nevis ashinrono, ne?

Jo nevar asinhroni darīties šādi:

function a()
{
  // ...
  var temp = 10;
  // ...
  result_from_ajax = ajax_request(..);
  // .. izmantojam result_from_ajax un temp
}

Tur tikai un vienīgi var sinrhoni.

 

Asinrhoni būtu jādara sekojoši:

function a()
{
  // ...
  var temp = 10;
  // ...

  // izsaucam ajax pieprasījumu ar callbacku
  ajax_request( function(result_from_ajax) {

 // te izmanto visu, ko atgriež ajax
 // un arī funkcijas a lokālos mainīgos, to temp piemēram
 // ...

  });
}

Link to comment
Share on other sites

Pirmais variants neder, jo ir ļoti neelastīgs. Manā gadijumā ideja ir šāda:

 

1) funkcija get() veic datu ajax pieprasījumu.

2) piemēram funkcija asd1() { izsauc get('lapa1.php); sanemot ajax response apstradā saņemtos datus, iespējams izsauc citas funkcijas etc. un veic sarežģītas operācijas.

3) cita funkcija asd2() { arī izsauc get('lapa2.php); un atkal atbildi vēlas apstrādāt pa savam.

 

Attiecīgi bija ideja radīt lielāku fleksibilitāti. Globālie mainīgie piederās pie watch() funkcijas iespējamā risinājuma pēc tutoriāļiem.

 

 

Atbilde uz bubu edit: Hmm izskatās, ka patiešām šeit laikam viss ērtāk būtu veikt sinhrono pieprasījumu, pavisam aizmirsu. + Papētīšu callbackus arī varētu nostrādāt.

 

Paldies

Link to comment
Share on other sites

Tas pirmais variants jau tieši ar to callbacku :) Reku ir tas callbacks: "function(){ updatePage(request, target); }" Tu tur tikai izsauc atsevišķu updatePage funkciju. Varēji jau padot visus vajadzīgos lokālos mainīgos no get() funkcijas tai updatePage funkcijai. Es savā piemērā vienk neizsaucu nekādu atsevišķu funkciju bet rakstīju visu kodu turpat - iekš tās closure's.

Link to comment
Share on other sites

Mhm bet tas ir diezgan neelastīgi, attiecīgi viena iespējamā response funkcija visiem izsaukumiem :)

 

Mana ideja, kad rakstīju bija šāda get(page, callback_func) { } un attiecigi uz request.onreadystatechange = function callback_func(); un ja nav noradiita atseviski tad izpildam defaulto updatePage.

vienīgi japaeksperimentee kā to korekti palaist.

 

 

Cik saprotu asinhronos pieprasījumus taisīt gan nevarēs freezo visu browseri tapēc meiģināšu radīt augstāk minēto callbacku sistēmu, paldies!

Link to comment
Share on other sites

Delfins, tevis teiktais tieši tas pats, ko es teicu :) Vienkārši ši te diskusija uzvirzija uz pareizajām sliedēm kā risināt problēmu:

 

Gatavs piemērs, nezinu kā ir ar to eval izmantošanu, bet citus piemērus pagaidām neesmu atradis:

function get(page, target, callback_func) 
{
request = createRequest();	  
request.onreadystatechange = function()
{ 
if(request.readyState == 4 && request.status == 200) 
	 { 
	if(callback_func) { eval(callback_func + '(request.responseText)'); }
	else { updatePage(request, target); }
	 }
  }

 

Paldies visiem!

Edit. bubu, pārakstījos, sorry - bija domāti sinhronie

Link to comment
Share on other sites

updatePage nē, tikai saliktajai, kas tiek ņemta no funkcijai padotajām vērtībām, jo ar FF 2.0.0.11 firebug ziņo:

 

callback_func is not a function

[break on this error] if(callback_func) { callback_func(request.responseText); }

 

eval variants strādā kā vajag un izpilda izsaukto funkciju.

Link to comment
Share on other sites

Nebiju tādu firebugu nekad lietojis. Uzinstalēju to 1.05 un nekādu erroru tas neizmeta uz manu koda piemēru. Nu vismaz nezinu, kur skatīties, ja šis izmeta. Labajā apakšējā stūrī tur uz firebuga ikoniņas noņemu abus Disable ķekšus un laidu savu html failu ar to js kodu. Nekādi errori neparādījās. Vai tik tev nav kautkāds sačakarēts firefoksis - kautkādi extensioni moš konfliktē savā starpā.

Link to comment
Share on other sites

×
×
  • Create New...