Search code examples
apache-flexflex4flex4.5blazedsflex-mobile

Flex multiple remote object call


I've a problem with multiple remote object calls. So that firstly I must retrieve employerID's from server (using BlazeDS btw), secondly I must make a request for each employerID and retrieve other details for EACH employer (another 2 remote object calls for each employerID) according there employerID's. So as you understood 3rd remote object call will take the 2nd's response as its parameter, and the 2nd one will take 1st's response as parameter.

My problem is that when I iterate through the response of first request it call's the 2nd remote object only for its last element not for each.

Here's my view code:

<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>

How can I make flex threads wait until the previous one returns a response? any thread handling method?


Solution

  • I think the problem is that you are overwriting the token everytime

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

    so only the response for the last request is handled.

    You should not use the static responder yatakOdaGetirResponder, but create a new CallResponder object for every request.

    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);
    }