2012-12-19 51 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调用,我只想在两者都完成时运行一个函数。我不想通过串联运行来降低速度 –