[Javascript] Ajax resultaat verwerken na volledig laden

Pagina: 1
Acties:

Vraag


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Door middel van een ajax request laadt ik een stukje code dat ook javascript bevat. Deze javascript voer ik uit na het laden door middel van eval(). Om te voorkomen dat de eval() aangeroepen wordt voordat de ajax call klaar is, doe ik het met een callback:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function one(callback)
{
  setTimeout(validateean,250);
}

function two()
{
    var url = 'id=20&ean=' + product_ean.value;
    var frame = 'div_result';
    

    var requests = []; 
    var i = requests.length; 
    requests[i] = new XMLHttpRequest(); 

    if (requests[i]) 
    {
          url = 'getdata.php?' + url;
        requests[i].open('GET', url, true);
        requests[i].onreadystatechange = function()
        {
            if(requests[i].readyState == 4) 
            {
                document.getElementById(frame).innerHTML = requests[i].responseText; 
                requests[i] = null; 
            } 
        }
        requests[i].send(null); 

    }
}

function validateean()
{

$("#div_result").find("script").each(function(i)
{
     eval($(this).text());
 });

}



one(two());


Het probleem waar ik tegenaan loop is dat eval() soms al aangeroepen wordt nog voordat de volledige ajax pagina geladen is. De request is dan al wel compleet waardoor functie validateean() wordt aangeroepen, maar omdat het resultaat nog niet compleet is wordt de javascript niet uitgevoerd.

Ik ben hier echt al dagen mee bezig maar krijg het maar niet opgelost. Ik kan er een vertraging in zetten maar omdat de vertraging willekeurig is, is geen goede oplossing.

Weet iemand of er een manier is om validateean() pas aan te roepen als niet alleen de request voltooid is maar ook het resultaat echt klaar met laden is?Of zit er toch een fout in mijn code waardoor dit probleem veroorzaakt wordt?

p.s. dit wordt allemaal gedaan in een beveiligde/afgesloten omgeving, het is alleen voor mijzelf dus dat het werkt heeft meer prioriteit dan bijvoorbeeld veiligheid

[ Voor 4% gewijzigd door FireFoz op 26-09-2019 14:56 ]

Leef lekker in het nu, er is niks anders

Alle reacties


  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 27-09 13:05
Ik snap weinig van je code.... uberhaupt staat er nergens in dit stukje de plek waar je validateean aanroept.

Je roept iets met ajax aan... in de callback van die ajax kan je toch je validate functie aanroepen?

Ik zie trouwens dat je 'one(two());` doet... even alleen daarnaar gekeken: dat zou het resultaat van 'two' aan 'one' geven... wat is de return value van 'two' dan ?...

Ik zou me, als ik jou was, verder verdiepen in javascript asynchronous requests en callback ... of gewoon sync'ed request gebruiken :)

[ Voor 42% gewijzigd door reddevil op 26-09-2019 14:58 ]


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
reddevil schreef op donderdag 26 september 2019 @ 14:54:
Ik snap weinig van je code.... uberhaupt staat er nergens in dit stukje de plek waar je validateean aanroept.

Je roept iets met ajax aan... in de callback van die ajax kan je toch je validate functie aanroepen?
Excuus, om het wat minder complex te maken heb ik wat code weggelaten dat niet relevant is waardoor het niet helemaal klopte.

Onderaan wordt one(two()) aangeroepen. Voor de eenvoud heb ik het hier even gewoon zo neergezet, maar in de praktijk dit wordt gedaan na het invoeren van een waarde (EAN). Vervolgens is het de bedoeling dat er informatie opgehaald wordt d.m.v. ajax, en de javascript die daar in staat ook wordt uitgevoerd.
reddevil schreef op donderdag 26 september 2019 @ 14:54:

Ik zie trouwens dat je 'one(two());` doet... even alleen daarnaar gekeken: dat zou het resultaat van 'two' aan 'one' geven... wat is de return value van 'two' dan ?...
Er wordt inderdaad niets teruggegeven, maar de hele reden waarom ik het in een callback heb gezet is omdat voor zo ver ik begrijp, de functie one pas verder gaat als de functie two (het laden van de code) klaar is. De bedoeling hiervan is dus dat validateean pas uitgevoerd is als functie two klaar is.

[ Voor 27% gewijzigd door FireFoz op 26-09-2019 15:02 ]

Leef lekker in het nu, er is niks anders


  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Ik weet niet in wat voor omgeving je werkt en wat de eisen zijn qua comptabiliteit, maar wellicht een idee om fetch te gebruiken? Dan kun je gebruik maken van promises, wat volgens mij je probleem oplost met of/wanneer iets klaar is.

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
eval moet je z.s.m. nooit meer gebruiken.
je product_ean.value is niet encodeURIComponent encoded
onreadystatechange is oud, er zijn nieuwe opties in XHR2 wat je code een stuk duidelijker maakt.
En dan kan je het ook in een fancy Promise knikkeren.

Maar begin eens met DOMContentLoaded ipv die gruwelijke setTimeout

[ Voor 18% gewijzigd door DJMaze op 26-09-2019 15:08 . Reden: url toegevoegd ]

Maak je niet druk, dat doet de compressor maar


  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 27-09 13:05
FireFoz schreef op donderdag 26 september 2019 @ 14:59:
[...]
Er wordt inderdaad niets teruggegeven, maar de hele reden waarom ik het in een callback heb gezet is omdat voor zo ver ik begrijp, de functie one pas verder gaat als de functie two (het laden van de code) klaar is. De bedoeling hiervan is dus dat validateean pas uitgevoerd is als functie two klaar is.
Nee, dat is hetzelfde als eerst one() uitvoeren en dan two() onder elkaar. Ze wachten altijd op elkaar... tenzij 1 van je functies een async call uitvoert... daar wacht ie niet op.

Je wilt je callback pas uitvoeren NADAT de ajax request klaar is... lijkt me logisch waar je 'm dan zou plaatsen, toch?

PS. Libraries toevoegen om dit probleem op te lossen is niet heel zinvol imho... callbacks blijven callbacks, ook in het oude JS werkt het ;) Eerst het principe doorhebben voordat er een andere manier van werken of library wordt gebruikt die het e.e.a. mogelijk vereenvoudigd

[ Voor 16% gewijzigd door reddevil op 26-09-2019 15:10 ]


Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 14:35
Als je moet wachten op meerdere dingen die gelijktijdig lopen: gebruik een promise.
Pagina: 1