Toon posts:

[PHP/Javascript] Ajax requests simultaan uitvoeren

Pagina: 1
Acties:

Onderwerpen


  • T i M
  • Registratie: april 2004
  • Laatst online: 24-09 15:15
Ik heb een applicatie geschreven waarvoor ik nu ook een import module aan het maken ben. De code is klaar ben bezig met de laatste stappen van de view.

In de laatste stap van de import wordt de data geimporteerd in de database. Ik zou de gebruiker graag willen laten zien wat de status is van de import (met een voortgangsbalk).

Op het moment ziet het er zo uit:
- via een AJAX request roep ik een actie aan op de server die de import start
- de import houdt via een sessie zijn status bij (wel item hij aan het importeren is)
- na het starten van de import roep ik een andere ajax functie aan die de import sessie uitleest en die geeft terug bij welk item hij is. Die functie wordt om de halve seconde opnieuw uitgevoerd totdat de import klaar is.

Het probleem:
De import wordt netjes gestart, maar de ajax requests voor het ophalen van de status worden pas uitgevoerd als het eerste requests afgehandeld is (het importeren).

Ik krijg nu alleen de status te zien op het moment dat het importeren voltooid is.

Iemand een idee hoe dit op te lossen?

  • fleppuhstein
  • Registratie: januari 2002
  • Laatst online: 21-05 22:01
Klinkt als of je asynchroon request blokt. Loop eens door je code heen, en kijk of je het initiële request (de import) wel als een asynchroon request afschiet, en niet op de uitkomst blijft wachten.....

Maw vuur het request af op je webserver, en geef bij de aanroep een x aantal callbacks mee. Die aan worden geroepen zodra je initiële request klaar is. Bijvoorbeeld het stoppen van de periodical updater die steeds de status ophaalt van de import.

  • yade
  • Registratie: mei 2002
  • Laatst online: 16-09 21:02
Geen idee. Vooralsnog is het geen Ajax iig. ;) Heb je voorbeeld code?

  • T i M
  • Registratie: april 2004
  • Laatst online: 24-09 15:15
yade schreef op dinsdag 12 oktober 2010 @ 10:10:
Geen idee. Vooralsnog is het geen Ajax iig. ;) Heb je voorbeeld code?
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function startImport() {
    $.ajax({
        url:"<?php print Globals::getBaseUrl("/configuration/import-file/start-import") ?>",
        async: true,
        success: function() {
            // doe iets
        }
    });
}

function getImportStatus() {    
    // code
    
    $.ajax({
        url:"<?php print Globals::getBaseUrl("/configuration/import-file/get-import-status") ?>",
        dataType: "json",
        success: function(data) {
                        // code
        }
    }); 
}


PHP:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public function startImportAction() {
        // code 
        $importModule = $this->_getImportModule();
        $importModule->import();
    }

    public function getImportStatusAction() {
                 // code

        $importModule = $this->_getImportModule();

        $retArr = array();
        $retArr["importedItems"] = $importModule->getImportedItems();
        
        print Zend_Json::encode($retArr);
    }

  • yade
  • Registratie: mei 2002
  • Laatst online: 16-09 21:02
Wordt de status update gestart in de succes function van import toevallig?

  • T i M
  • Registratie: april 2004
  • Laatst online: 24-09 15:15
yade schreef op dinsdag 12 oktober 2010 @ 10:25:
Wordt de status update gestart in de succes function van import toevallig?
Nee:

JavaScript:
1
2
3
4
$(document).ready(function() {
    startImport();
    getImportStatus();
});


De getimportstatus wordt dmv de setTimeout functie om de halve seconde opnieuw aangeroepen.

  • Accesteam
  • Registratie: maart 2009
  • Laatst online: 24-09 17:17
Al is gekeken met firebug wat er precies gebeurd? En misschien is voor de lol zonder het zonder die fcunties proberen (dus de 2 ajax requests gewoon achter elkaar zitten in de .ready() ).

  • LuCarD
  • Registratie: januari 2000
  • Niet online

LuCarD

Certified BUFH

Hoe hou je de import status bij aan de PHP kant?
- de import houdt via een sessie zijn status bij (wel item hij aan het importeren is)
Dit suggereert dat je alles via sessie waardes probeert te doen, maar dat zal niet gaan werken. Aangezien de sessie waardes pas worden geupdated aan het eind van import script.

Dit kan je beinvloeden als je session_write_close() tussen door aanroept. ( en session_start() )

[Voor 86% gewijzigd door LuCarD op 12-10-2010 11:02]

Programmer - an organism that turns coffee into software.


  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je de url's wel goed ge-escaped? Of is dat alleen een foutje van de code parser van GoT?
offtopic:
Ik zag even niet dat het PHP binnen JS was

[Voor 24% gewijzigd door Woy op 12-10-2010 11:02]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Janoz
  • Registratie: oktober 2000
  • Laatst online: 23:40

Janoz

Moderator Devschuur®

!litemod

* Janoz is met LuCarD. De sessiescope in php is geen echte sessiescope en daar loop je precies in deze toepassing tegenaan. Waarschijnlijk kun je beter de status van de upload in shared memory of in de database (wat eigenlijk ook shared memory is ;) ) bijhouden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • T i M
  • Registratie: april 2004
  • Laatst online: 24-09 15:15
LuCarD schreef op dinsdag 12 oktober 2010 @ 10:56:
Hoe hou je de import status bij aan de PHP kant?


[...]


Dit suggereert dat je alles via sessie waardes probeert te doen, maar dat zal niet gaan werken. Aangezien de sessie waardes pas worden geupdated aan het eind van import script.

Dit kan je beinvloeden als je session_write_close() tussen door aanroept. ( en session_start() )
Ik zet inderdaad een sessie waarin ik de importclass opsla.

Zal die functies opnemen in mijn code, maar dat zal mijn probleem wat ik nu heb niet oplossen. Ik zal even gaan spelen met de debugger.

Update:

Heb de XMLHTTP aanvragen gelogd in Firebug en zie hieronder het resultaat:


De start-import url wordt aangeroepen en vervolgens om de 0,5 seconden wordt er een request gestart naar get-import-status. De get-import-status requests worden echter pas beantwoord, zodra de start-import klaar is.

[Voor 23% gewijzigd door T i M op 12-10-2010 11:39]


  • T i M
  • Registratie: april 2004
  • Laatst online: 24-09 15:15
LuCarD schreef op dinsdag 12 oktober 2010 @ 10:56:
Hoe hou je de import status bij aan de PHP kant?


[...]


Dit suggereert dat je alles via sessie waardes probeert te doen, maar dat zal niet gaan werken. Aangezien de sessie waardes pas worden geupdated aan het eind van import script.

Dit kan je beinvloeden als je session_write_close() tussen door aanroept. ( en session_start() )
Je bent de held van de dag! Heb de PHP documentatie van die functie er even bij gepakt. De sessie was gelokt waardoor de import-status functie moest wachten totdat de sessie vrij werd gegeven.

Krijg nu een mooie voortgangsbalk te zien. Bedankt voor de hulp.

  • YopY
  • Registratie: september 2003
  • Laatst online: 21:37
Ik zou overigens nog steeds niet de voortgang in een sessievariabele opslaan. Een sessievariabele is iets gekoppeld aan één gebruiker, terwijl iets als een import nu net iets is wat ik niet met één enkele gebruiker zou associeren.
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee