2011-03-13 101 views
0

我有一个在Parent中调度事件的子组件。父母的事件打电话给我们的数据库。目前,该事件被解雇&孩子继续没有结果。我该如何做到让孩子等待孩子继续学习数据库的结果?如何等待事件完成

儿童

<fx:Script> 
<![CDATA[ 
dispatchEvent(new Event("getDBcontents")); // dispatch the event in the parent 

// do some more stuff here but we need pause until we get the result from the parent 

    ]]> 
</fx:Script> 
在父母

public function getDBcontents(event:Event):void { 

otherChild.getResult.token = otherChild.childRet.getContents('userID.text'); 

} 

回答

0

移动“//做一些更多的东西在这里,但我们需要暂停,直到我们得到来自母公司的结果”一节一不同的部分。我假设你正在对你的数据库进行一个远程调用,它有一个回调。我不确定你正在使用哪种机制,但让我们假设一个RemoteObject。

您可以在发送的自定义事件上传递一个函数。您的代码的数据库部分可以将该函数指针附加到AsyncToken,或者将其添加到类实例中。然后,当它返回结果时,您可以调用您作为事件一部分传入的函数。异步编程的乐趣。

我建议您查看Cairngorm和Swiz(Swiz是我的首选框架)中使用的模式,因为他们在这些框架中执行数据库调用的方式正是您在此尝试执行的操作。

举个例子,你可以做这样的事情:

dispatchEvent(new MyCustomEvent("getDBcontents", callBackFunction)); 

private function callBackFunction(stuffToProcess:Object):void { 
    //do more stuff here after the stuff is returned 
} 


//first create MyCustomEvent class extending Event 

//Then you need something to handle the event, you can build the event listener yourself, or use something like Swiz to make your life easier 

//here is your event handler that you can call yourself, or assign through Swiz Cairngorm 

var st:Function; 
public myEventHandler(event:MyCustomEvent):void { 
    st = event.callBackFunction; //your param on your custom function 
    var token:AsyncToken=this.service.doSomething(); 
    var responder:mx.rpc.Responder=new mx.rpc.Responder(genericResultsHandler, faultHandler); 
    token.addResponder(responder); 
} 

genericResultsHandler(result:ResultEvent):void{ 
    if (st != null) 
    st(result.data); 
} 
+0

我使用PHP服务瓦特/回调。 “然后,当它返回结果时,你可以调用你作为事件一部分传入的函数。”...我该怎么做? – 2011-03-13 16:55:24

+0

我翻遍Swiz和Cairngorm,但无法很好地遵循。没有办法“强制”我的脚本暂停,直到我从数据库中得到结果为止? – 2011-03-13 17:19:25

+0

不,没有办法让你的代码以你想要的方式“暂停”。网络调用在actionscript中是异步的,因此您需要提供回调机制。这个回调机制为您提供了您正在寻找的伪“暂停”。我强烈建议回去看看Swiz,因为它可以帮助您轻松地组织您正在尝试执行的任务。 – Scott 2011-03-13 21:08:17