2013-12-13 72 views
0

我創建使用Flex的SWF項目,我有一些關於它的複選框,每當複選框seleced它會調用複選框處理器:如何創建同步功能的Flex

function checkBoxHandler() { 
    //call resultHandling 
    var obj:myObjectType = new myObjectType(); 
    resultHandling(obj) 
} 

function resultHandling(myObject:myObjectType) { 
    //implementation code to send a request to server side 
} 

,纔有可能使「 resultHandling(...)「是一個同步函數?因此,無論何時我們撥打該功能時都會出現問題,特別是當有多個函數調用時

回答

0

您可以創建一個arraycollection並將所有myObjectType對象存儲在其中。然後做類似的事情 -

var arr:ArrayCollection = new ArrayCollection(); 
    function checkBoxHandler() { 
    //call resultHandling 
    var obj:myObjectType = new myObjectType(); 
    arr.addItem(obj); 
    } 

    function resultHandling(myObject:myObjectType) { 
    //implementation code to send a request to server side 
    } 

    function webServiceResponseHandler(){ 
    //receive the response from server 
    sendWSRequest(); 
    } 

    function sendWSRequest(){ 
     if(arr.length > 0) 
     { 
      resultHandling(arr.getItemAt(0)); 
      arr.removeItemAt(0); 
     } 
    } 
2

由於Flex是Flash,所以Flash的限制也適用於Flex。其中之一是(實際上在更新的Flash版本中,這不再是100%有效的)Flash只有一個線程。該線程完成從更新/繪製UI,處理應用程序邏輯,處理IO等等的所有事情。因此,同步調用將是阻塞調用,並且在客戶端 - 服務器通信中,此塊可能會很長。因此,Flash不支持阻止對服務器的調用,並且您將無法找到解決方案...不幸的是。

但是請放心,實際上您將開始以這種方式創建更強大的應用程序。我注意到即使在可以使用同步調用的地方創建越來越多的異步解決方案:-)

0

大多數Flash I/O是異步的,無法改變這種情況。考慮使用內嵌嵌套處理

function checkBoxHandler() { 
    var obj:myObjectType = new myObjectType(); 

    var resultHandling:Function = function():void { 
     //you can just reference obj here 

     var resultHandling2:Function = function():void { 
     }; 
    }; 

    //implementation code to send a request to server side 
} 

,或者使用任務調度,如Parsley Command Framework

+1

Flash中通常不鼓勵內聯和匿名函數。除非它們被正確使用和處置,否則它們可能是一個主要的內存泄漏。 –

+0

如果您沒有將它們用作事件處理程序,則不應該是這種情況。傳入「響應者」。 – artema