2012-12-19 14 views
7

Ich bin derzeit eine App vor allem für Selbsterziehung Zwecke der Entwicklung und da ich noch nicht vollständig verwendet, um js bin könnte ich Hilfe für mein Problem verwenden:Warten auf mehrere Events

In meiner app ich bin mit einer Javascript-Bibliothek (jqMobi), die für DOM-Manipulation, Seitenübergänge, Ajax-Aufrufe usw. verwendet wird, und ich nutze auch Phonegap, um auf Gerätefunktionen wie die Geolocation zuzugreifen.

Wenn ich meine App starte, möchte ich die Geolokalisierung des Geräts erhalten, eine AJAX (JSONP) -Anforderung an meinen Server (einschließlich der Geolokalisierung des Geräts), die ein Array von JSON-Objekten zurückgibt, die ich verwenden werde Erstelle eine Liste.

Bevor ich die Geolocation bekommen kann, muss ich warten, bis phonegap geladen wird. Und bevor ich jqMobi verwende, um den Ajax anzurufen und die Antwort zu verarbeiten, muss ich darauf warten, dass sie auch geladen wird.

So habe ich im Grunde zu Veranstaltungen im Hören auf

document.addEventListener("DOMContentLoaded",execute_this,false); //jqMobi is now ready 
document.addEventListener("deviceready", execure_sth, false); //Phonegap is now ready 

Wie führe ich eine Funktion, sobald diese beiden Ereignisse ausgelöst haben und bevor nicht?

Wenn ich jQuery verwenden würde, würde ich seine $ .Deferred-Objekte und seine Wann ... Dann-Funktion verwenden, aber da ich keinen Zugriff auf diese habe, suche ich nach einer Alternative.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

1

die Sie interessieren,

document.addEventListener("DOMContentLoaded",execute_this,false); 
function execute_this(){ 
document.addEventListener("deviceready", execure_sth, false); 
} 
function execute_sth(){ 
//your code here 
} 
+1

Danke für Ihre Hilfe. Eine Frage allerdings: Was passiert, wenn beispielsweise das Device-Event vor DOMContentLoaded auftritt? Würde es noch execute_sth aufrufen? – marius2k12

+0

Siehe auf der phonegap-Website http://docs.phonegap.com/en/1.0.0/phonegap_events_events.md.html "Normalerweise möchten Sie einen Ereignis-Listener mit document.addEventListener hinzufügen, sobald das DOM des HTML-Dokuments hat geladen. " – ppsreejith

18

Auf den ersten Blick, so etwas wie dies funktionieren würde auf jeden Fall:

var executed_this = false, executed_sth = false; 

function execute_this() { 
    executed_this = true; 
    combined_execution(); 
} 

function execute_sth() { 
    executed_sth = true; 
    combined_execution(); 
} 

function combined_execution() { 
    if (executed_this && executed_sth) { 
    // magic! 
    } 
} 

Aber ist nicht erweiterbar (was, wenn Sie ein drittes Ereignis warten soll auf?). Ein Zähler würde funktionieren:

Ist erweiterbar, aber das geht davon aus, dass die Ereignisse nur einmal ausgelöst werden. In beiden Fällen sind dies die Primaten, die die Art der Flusskontrolle steuern können, nach der Sie fragen, und alles andere ist (größtenteils) eine Abstraktion auf höherer Ebene auf diesen beiden.

+0

EIN LINER !! wooo! 'if (--waitOn! == 0) return false' :) –

+0

Das hat bei mir in meinem Szenario funktioniert, ich habe 2 Ajax-Aufrufe, die parallel gemacht werden und ich möchte nur eine Funktion ausführen, sobald beide fertig sind. Und ich möchte sie nicht verlangsamen, indem ich sie hintereinander laufe –