Flex上的多任务问题

时间:2012-02-28 19:47:21

标签: php multithreading flex actionscript

我有一个方法可以同时从PHP调用两个服务。由于Flex的多任务处理能力,我认为每个服务都在不同的线程中调用。

我的问题是:两个服务都从数据库返回一个对象数组。但第二个服务将提供一个DataGrid,它具有每个记录的处理程序。这个处理程序将比较两个Arrays中的那个,当Flex在完成第一个之前完成第二个时,我遇到了问题,因为处理程序试图将数据与空对象进行比较(PHP服务尚未响应)。

有什么想法吗?

修改

在我发布这个问题的那天,有些人给了我一个惊人的想法,但遗憾的是他似乎删了他的帖子,我不知道为什么。 我坚持他的想法,我找到了一个符合我的设计模式的解决方案。

他告诉我把一个标志告诉我数据是否已经加载。 所以这就是我现在正在做的事情: 我叫第一个服务; 我打电话给第二次服务;

在第一个服务的结果上,我检查第二个服务上的Flag,如果是,它意味着它已经被加载,所以我可以将我的数据存储在DataGrid中,以便可以调用处理程序。 如果该标志为false,则表示尚未加载第二个数据,因此我将其存储在一个没有绑定到dataGrid的_temp DataProvider上,而不是存储在官方dataProvider中的数据。在这种情况下,当加载第二个数据时,会将侦听器事件分派给第一个服务,告诉他捕获_temp dataProvider并将其复制到官方dataProvider。

特别是,我喜欢这个解决方案,并没有打破Table Data Gateway设计模式。

感谢大家的帮助。

3 个答案:

答案 0 :(得分:5)

  

由于Flex的多任务处理能力,我认为每项服务都是   在另一个线程中调用。

是什么让您认为Flex支持多线程? It really doesn't. Single Thread only.

但是,您的调用是异步的,因为当它们被发送时,程序不会停止等待答案,而是监听完成事件。

您的解决方案很简单:只发送第一个请求,等待它完成,然后在完成处理程序中发送第二个请求。

修改

要保留您的设计模式,您可以应用两种不同的策略:

  1. 使用Business Delegate pattern:让自定义类充当网关,并封装与服务的实际连接。然后它可以调度自己的COMPLETE事件来触发您拥有的处理程序。对于DataGrid,它看起来像是一个异步调用。

  2. 使用Session Facade pattern:在服务器端创建单个服务,该服务接受单个请求,在本地调用引用的服务,并在单个响应中返回两个服务的组合数据。

答案 1 :(得分:1)

Flex没有多线程,但它可以同时进行多个异步调用。您可以通过检查每个返回处理程序以确保在进入依赖于两者的代码之前返回两个服务来处理不知道哪个将首先返回。

答案 2 :(得分:0)

我们假设您有两项服务.. FirstService SecondService

private function init(): void
{
  // Call the first service.
  myService.FirstService();
}

private function firstServiceResult(re:ResultEvent) :void
{
  // Perform what you need to do with the results of your FirstService (i.e. set the result to array).
  // Afterwards, call the next service.
  myService.SecondService();
}

private function secondServiceResult(re:ResultEvent) :void
{
  // Perform what you need to do with the results of your SecondService.
  // Now you can compare the result in the first service and the second service.
}