2012-12-19 118 views
7

我目前正在開發一個應用程序主要用於自我教育的目的,因爲我還沒有完全地使用js的我可以利用一些幫助我的問題:等待多個活動

在我的應用我使用一個用於DOM操作,頁面轉換,ajax調用等的JavaScript庫(jqMobi),我還使用phonegap訪問設備功能,如地理定位。

當我開始了我的程序,我想獲得設備的地理位置,發送AJAX(JSONP)要求到我的服務器(包括設備的地理位置),它返回我將使用JSON對象的數組建立一個清單。

在我可以得到地理位置之前,我需要等待phonegap加載。在使用jqMobi進行ajax調用並處理響應之前,我需要等待它加載。

所以我基本都對事件即時通訊聽

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

如何儘快執行功能這兩個事件都燒不前?

如果我使用jQuery,我會利用它的$ .Deferred對象和它的When ... Then Function,但因爲我沒有訪問這些我正在尋找替代品。

在此先感謝您的幫助!

回答

1

試試這個,

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

感謝您的幫助。但有一個問題:如果在DOMContentLoaded之前發生deviceready事件,會發生什麼?它仍然會調用execute_sth嗎? – marius2k12

+0

請參閱根據phonegap站點http://docs.phonegap.com/en/1.0.0/phonegap_events_events.md.html 「通常情況下,一旦HTML文檔的DOM具有一個附加事件偵聽器和document.addEventListener裝「。 – ppsreejith

18

乍一看,這樣的事情肯定會工作:

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! 
    } 
} 

但是不可擴展(如果你想要第三個事件,以等待?)。一個計數器可以工作:

var wait_on = 2; 

function execute_this() { 
    combined_execution(); 
} 

function execute_sth() { 
    combined_execution(); 
} 

function combined_execution() { 
    wait_on--; 
    if (wait_on === 0) { 
    // magic! 
    } 
} 

更具擴展性,但假設事件只觸發一次。無論哪種方式,這些都是可以控制您要求的流量控制類型的主要因素,而其他所有(大部分)都是對這兩者進行更高級別的抽象。

+0

ONE LINER !!的Wooo! 'if(--waitOn!== 0)return false' :) –

+0

在我的場景中,這對我有用我有2個並行完成的ajax調用,我只想在兩者都完成時運行一個函數。我不想通過串聯運行來降低速度 –