2009-08-19 56 views
0

Web服务调用在flex中是异步的,但我想在一个类中封装Web服务调用以提供同步封装。像下面这样 - 用户可以调用getMyMethodResult并获取Web服务返回的结果。我预计收到soap响应的线程会填充变量_result,并且意味着getMyMethod在一段时间后会发现_result不再为空。但它不!任何人都可以解释为什么这不起作用?在flex中编程同步Web服务调用

public class myClass 
{ 
    private var _result:Object; 
    public function myClass() 
    { 
     //create a web service object 
     ... 

     // Add listener 
     _service.addMyMethodListener(myMethodListener); 
    } 

    public function getMyMethodResult() 
    { 
     _service.myMethod(); 

     while (_result == null) 
     { 
     // count a variable or something (unimportant) 
     } 

     return _result; 
    } 

    private function myMethodListener(event:Event):void 
    { 
     _result = event.result; 
    } 
} 

回答

1

这绝对不支持。事件循环在帧之间运行,只要您用(无限)循环阻止执行,myMethodListener函数将不会被调用。无论如何,这将是一个可怕的想法,因为在Flash Player中不存在线程会导致您的UI在您等待服务返回时冻结。你应该放弃这个想法。

+0

感谢您的回复。 我还是不明白;我以为他们在不同的线程中运行?如果不是由不同的线程处理异步返回,Flash播放器如何处理?如果事件循环处理所有事情,你能否解释这些任务的执行顺序?谢谢 – 2009-08-19 15:30:30

+0

顺便说一句,我很高兴“放弃这个想法”,我只是想知道为什么它不起作用,所以我可以更好地理解flash播放器/ flex的操作方式。我新来flex! – 2009-08-19 15:31:55

+1

Flash Player在接收到类似事件时不会中断您的代码执行。如果我没有弄错,它会等到下一帧。播放器的后台实现可能使用线程来完成,但将事件排队,以便动作只在一个线程上执行。 – sharvey 2009-08-19 15:42:39