2012-04-12 52 views
1

我有多個遠程對象調用的問題。因此,首先我必須從服務器檢索employerID(使用BlazeDS btw),其次我必須爲每個僱主ID提出請求,並根據僱主ID檢索每個僱主的其他詳細信息(針對每個僱主ID的另外兩個遠程對象調用)。因此,正如你理解的那樣,第三個遠程對象調用將把第二個響應作爲參數,第二個響應將第一個響應作爲參數。Flex多個遠程對象調用

我的問題是,當我通過第一個請求的響應迭代時,它只調用第二個遠程對象的最後一個元素,而不是每個。

這裏是我的視圖代碼:

<fx:Declarations> 
    <parsley:FastInject property="karBUS" type="{KarBUS}"/> 
     <s:CallResponder id="hastalariGetirResponder" result="hastalariGetirResponder_resultHandler(event)"/> 
     <s:CallResponder id="yatakOdaGetirResponder" result="yatakOdaGetirResponder_resultHandler(event)" fault="yatakOdaGetirResponder_faultHandler(event)"/> 
     <s:CallResponder id="hastaKartlariGetirResponder" result="hastaKartlariGetirResponder_resultHandler(event)"/> 
     <s:CallResponder id="hastaResimGetirResponder" result="hastaResimGetirResponder_resultHandler(event)"/> 
     <parsley:Configure /> 
    </fx:Declarations> 

<fx:Script> 
     <![CDATA[ 

[Inject(id="karBUS")] 
public var karBUS:KarBUS; 

      protected function view1_creationCompleteHandler(event:FlexEvent):void 
      { 


       trace("Hastalarim View: persID:"+SessionClientData.prsnl.personelId+",servisID: " + SessionClientData.servisId); 
       hastalariGetirResponder.token = karBUS.getHastalarim(SessionClientData.prsnl.personelId,SessionClientData.servisId); 

      } 

protected function hastalariGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       hastalarim = hastalariGetirResponder.lastResult; 

       if(hastalarim.length == 0) { 
        this.addElement(txt_empty); 
        this.removeElement(busy_ind); 
       } 

       for(var i:int=0;i<hastalarim.length;i++){ 

        kt = hastalarim.getItemAt(i) as Object; 

        vizitID = kt[6]; 
        hastaTC = kt[3]; 

        yatakOdaGetirResponder.token = karBUS.getYatakOdaNo(vizitID); 
       } 

      } 


protected function yatakOdaGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       yatakOda = yatakOdaGetirResponder.lastResult as Object; 

       hastaKartlariGetirResponder.token = karBUS.getHastaKarti(vizitID); 

      } 

      protected function hastaKartlariGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       hastaTuru = hastaKartlariGetirResponder.lastResult as String; 

       hastaResimGetirResponder.token = karBUS.getHastaResim(hastaTC); 
      } 

      protected function hastaResimGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       resim = hastaResimGetirResponder.lastResult as ByteArray; 


       dp=new ArrayCollection(); 

       var yatak:String; 
       var oda:String; 
       var kat:String; 

       if(yatakOda == null){ 
        yatak = ""; 
        oda = ""; 
        kat = ""; 
       }else{ 
        yatak = yatakOda[2]; 
        oda = yatakOda[1]; 
        kat = yatakOda[0]; 
       } 

       for(var i:int=0;i<hastalarim.length;i++){ 

        kt = hastalarim.getItemAt(i) as Object; 

        var dt:Date = kt[5] as Date; 
        var vizitT:String = dt.date + "-" + (dt.month+1) + "-" + dt.fullYear; 

        dp.addItem({hastaId:kt[0], adi:kt[1],soyadi:kt[2],tcKimlikNo:kt[3], resim: resim, 
         yasi:kt[4],katNo:kat,odaNo:oda,yatakNo:yatak, 
         vizitTarihi:vizitT,vizitId:kt[6],cinsiyeti:kt[7], hastaTuru:hastaTuru}); 


        trace("OdaNO - Yatak NO: "+ oda + ", " + yatak); 

       } 






      } 



    ]]> 
    </fx:Script> 

我怎樣才能使柔性線程等到前一個返回響應?任何線程處理方法?

回答

3

我認爲這個問題是要覆蓋令牌每次

for(var i:int=0;i<hastalarim.length;i++){ 
    ...  
    yatakOdaGetirResponder.token = karBUS2.getYatakOdaNo(vizitID); 
} 

所以只在最後請求的響應進行處理。

您不應該使用靜態響應程序yatakOdaGetirResponder,而是爲每個請求創建一個新的​​對象。

for(var i:int=0;i<hastalarim.length;i++){ 
    ...  
    var responder: CallResponder = new CallResponder(); 
    responder.addEventListener(ResultEvent.RESULT, yatakOdaGetirResponder_resultHandler); 
    responder.token = karBUS2.getYatakOdaNo(vizitID); 
} 
+0

是我想過這個......有沒有什麼辦法可以爲每個callresponder創建一個新的令牌?或者我必須在每次迭代之前創建不同的呼叫響應者? – 2012-04-12 11:45:31

+0

是的,這是我要做的,如果沒有其他替代品..現在我要將所有靜態呼叫響應者轉換爲動態呼叫響應者。但是這是一個很好的細節,謝謝你! – 2012-04-12 11:59:39

+0

還有一個問題,是否有任何方法知道所有4個遠程對象調用都是爲了將​​它們插入列表而完成的!因爲我瞭解Flex遠程對象調用以「隊列」方式工作 - 它將每個新調用放入一個隊列中,並且如果我寫入的結果處理程序已完成,那麼將它們全部調用它們...是否有更多上層類通知我們如果所有的請求都完成了或者類似的東西?! – 2012-04-12 13:48:33