köade funktioner i javascript

Permalänk
Medlem

köade funktioner i javascript

Hej!
Hur kan man köa funktioner i javascript?
Jag har fyra funktioner: showLoader, hideLoader, loadData1 och loadData2.

Jag vill alltså köra showLoader, sen loadData1 och loadData2 och när de är klara vill jag köra hideLoader.

Visa signatur
Permalänk
Medlem

Som du har beskrivit det..

showLoader(); loadData1(); loadData2(); hideLoader();

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Som du har beskrivit det..

showLoader(); loadData1(); loadData2(); hideLoader();

Funtionerna körs i rätt ordning, men den ena funktionen väntar inte på att den förra skall bli klar innan den körs. hideLoader() kommer att köras innan det att datan laddas in om det tar lite tid att ladda datan.
I mitt fall laddas det extern xml-data som kan ta ett tag att ladda...

Visa signatur
Permalänk
Medlem

anropa hideLoader() det sista du gör i loadData2()

Permalänk
Medlem

Ett sätt att lösa det på är att precis som skribenten ovanför mig säger anropa nästa metod i sist av allt i föregående metod. För att göra det lite mer flexibelt kan du göra så att dina funktioner tar en valfri callback-parameter som är en funktion, som körs sist av allt. Ett exempel:

var myFunction = function(cb) { // gör dina grejer här... // sist av allt: if(cb) cb(); } // anropa din funktion med en callback myFunction(function() { alert("nu är den klar!"); });

Edit: Om du använder jQuery kan du göra anropet till din callbackfunktion lite sexigare:

var myFunction = function(cb) { // gör dina grejer här... // sist av allt: ($.noop || cb)(); }

Permalänk
Medlem

Hur löser det något? Att köra en funktion sist i en annan funktion är ungefär likvärdigt med att köra den utanför men direkt efter, eller? Funktionsanropen är väl inte trådade. Om jag förstått saken rätt så är problemet att en av funktionerna startar en parallell process som laddar i bakgrunden. Det är Den funktionen som behöver en callback, inte funktionen som anropar den.

Om det är AJAX du använder för att hämta din data -- vilket låter troligt -- så finns det redan funktionalitet för att hantera callbacks. Det smidigaste är att använda sig av jQuery eller liknande.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Hur löser det något? Att köra en funktion sist i en annan funktion är ungefär likvärdigt med att köra den utanför men direkt efter, eller? Funktionsanropen är väl inte trådade. Om jag förstått saken rätt så är problemet att en av funktionerna startar en parallell process som laddar i bakgrunden. Det är Den funktionen som behöver en callback, inte funktionen som anropar den.

Om det är AJAX du använder för att hämta din data -- vilket låter troligt -- så finns det redan funktionalitet för att hantera callbacks. Det smidigaste är att använda sig av jQuery eller liknande.

Precis som du säger så blir det problem även om jag kör funktionen ifrån en annan...
Det är dock inte AJAX, och jag kan inte heller köra jQuery... Detta för att jag kodat Titanium.

Visa signatur
Permalänk
Medlem
Skrivet av ketels:

Detta för att jag kodat Titanium.

Vad är det? Fyll gärna på med info om din arbetsmiljö direkt så man slipper treva efter information

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Vad är det? Fyll gärna på med info om din arbetsmiljö direkt så man slipper treva efter information

Titanium (mobile) är en platform där man kodar javascript och sen kompilerar om till iPhone (objective-c) eller Android (java). Då har jag inte möjlighet att lägga in jQuery.
http://www.appcelerator.com/

Visa signatur
Permalänk
Medlem

jQuery är javascript så det kanske fungerar ändå. Hur ladda du in xml-filen idag?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Fast Titanium tillhandahåller säkertligen ingen DOM eller liknande, så jQuery är nog rätt meningslöst i det fallet.

Det låter som att du i Titanium ska specifiera en callback istället då?

Permalänk
Medlem

Wikipedia säger att jQuery stöds: http://en.wikipedia.org/wiki/Appcelerator_Titanium#Features
Som jag förstår det är Titanium helt enkelt ett verktyg för att "appifiera" en hemsida.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Wikipedia säger att jQuery stöds: http://en.wikipedia.org/wiki/Appcelerator_Titanium#Features
Som jag förstår det är Titanium helt enkelt ett verktyg för att "appifiera" en hemsida.

Tror att det syftar på om man bygger datorapplikationer och inte mobilappar... Jag har inte hittat något sätt att få in jQuery i mobilapparna (förutom i "webb-vyer").

Visa signatur
Permalänk
Medlem
Skrivet av ketels:

Tror att det syftar på om man bygger datorapplikationer och inte mobilappar... Jag har inte hittat något sätt att få in jQuery i mobilapparna (förutom i "webb-vyer").

Men hur bygger du dom då? Vad sitter du med för gränssnitt, var kommer JavaScript in i bilden och (återigen,) hur laddar du din xml-fil i dagsläget?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Men hur bygger du dom då? Vad sitter du med för gränssnitt, var kommer JavaScript in i bilden och (återigen,) hur laddar du din xml-fil i dagsläget?

Idag sitter jag och skriver i ett program som heter Aptana... Men man kan ju lika gärna skriva i notepad om man vill det...
Sen så använder man Titanium för att göra om javascript-koden till objective-c och java...

idag läser jag in min xml såhär:

function getXmlData(url) { var doc; if (Titanium.Network.online) { var xhr = Titanium.Network.createHTTPClient(); xhr.open("GET",url, false); xhr.send(); doc = xhr.responseXML.documentElement; } return doc; }

Visa signatur
Permalänk
Medlem

Vad händer om du kör följande?

function getXmlData(url) { var doc; if (Titanium.Network.online) { var xhr = Titanium.Network.createHTTPClient(); xhr.open("GET",url, false); xhr.send(); doc = xhr.responseXML.documentElement; } hideLoader(); return doc; }

Permalänk
Medlem
Skrivet av ketels:

Idag sitter jag och skriver i ett program som heter Aptana... Men man kan ju lika gärna skriva i notepad om man vill det...
Sen så använder man Titanium för att göra om javascript-koden till objective-c och java...

idag läser jag in min xml såhär:

function getXmlData(url) { var doc; if (Titanium.Network.online) { var xhr = Titanium.Network.createHTTPClient(); xhr.open("GET",url, false); xhr.send(); doc = xhr.responseXML.documentElement; } return doc; }

Testa

function getXmlData(url, callback) { var doc; if (Titanium.Network.online) { var xhr = Titanium.Network.createHTTPClient(); xhr.onload = callback; xhr.open("GET",url, false); xhr.send(); doc = xhr.responseXML.documentElement; } return doc; }

Anropa med getXmlData("http://www.wherever.com/mydata.xml", hideLoader)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av ketels:

function getXmlData(url, callback) { var doc; if (Titanium.Network.online) { var xhr = Titanium.Network.createHTTPClient(); xhr.onreadystatechange = function() { if (this.readyState == 4) { callback.call(this); return doc; } } xhr.open("GET",url, false); xhr.send(); doc = xhr.responseXML.documentElement; } }

Borde fungera?

Permalänk
Medlem
Skrivet av mel0dy:

Borde fungera?

Varför anropar den anonyma funktionen callback-funktionen med sig själv som kontext -- ska hideLoader använda sig av den? Varför returnerar samma funktion variabeln doc (som inte är satt till något); har onreadystatechange en handler som tar emot returvärden?

edit: det slog mig precis att doc kanske blir satt i efterhand genom closures..?

Visa signatur

Kom-pa-TI-bilitet