2012-04-30 2 views
0

Flex/ActionScript에서 비동기 시퀀스에 문제가 있습니다.ActionScript 3.0에서 메서드 시퀀스 연속 적용

이제
private function start():void{ 
    _menu = new MyMenu(); 
    _screen.addElement(_menu); 
    //Here, some Mouse Event Listener to Menu Click 
} 

,의 메뉴에서 클릭이 발생한다고 가정하자 : 다음은 예입니다.

private function menuClick(event:Event):void{ 
    removeMenu(); 
    addMenu(event.SomethingPassedByTheClick); 
} 

이제 이벤트 처리기의 오류를 잊어 버리십시오. 프로세스에 대해 생각해 보겠습니다. 내 문제는 오류가 발생하는 removeMenu() 전에 addMenu()가 끝나는 경우가 있습니다. 위의 스크립트는 실제 스크립트가 아니라 내 문제를 논리적으로 표현한 것입니다. sunup하기 위해 addMenu() 메소드가 호출되기 전에 removeMenu()가 완료 될 때까지 기다려야한다는 것을 정의 할 수 있어야한다. 이견있는 사람? 감사합니다.

편집 : 내 문제의

더 정확한 예 :

private function createComplete():void{ 
     _screenArray = new Array(
       new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
       new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
       new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 
     startUp(); 
} 

private function startUp():void{ 
    //Some mathematical calculations that changes a few 0 to 1's. 
    addNewComponent(); 
} 

private function addNewComponent():void{ 
    removeAllComponents(); 
    //More calculus on the array in order to create a component in vague space. 
    addComponentOnCalculatedArea(x, y); 
    //here is my problem: Sometimes, add Method is called before the removeAllComponents, which causes the new added component be removed by the removeAllComponents() method. 
} 

감사합니다 여러분. 나는 잘못된 전제를 가지고 있었다. 수학의 계산 방식이 잘못되어 무엇이 잘못되었는지, 메서드 호출 순서는 아닙니다. 나는 Script의 각 메소드에 trace()를 추가하여 알아 차렸다.

+1

독립 샘플 응용 프로그램을 게시 할 수 있습니까? 거기에 중간에 뭔가가 끼어들 수 없기 때문에 전적으로 여기를 잘 따랐는지 확신 할 수 없습니다. 생각해볼 때, removAllComponents 뒤에 무한 while 루프를 두어 아무 것도 실행되지 않는다는 것을 알아두기 – devshorts

+1

'removeAllComponents' 메소드가 비동기 방식으로 실행되지 않으면'removeAllComponents'가 실행을 완료 할 때까지'addComponentOnCalculatedArea'를 실행할 수 없습니다. 디버거를 사용하여 트레이스를 배치하거나 단계별로 진행해야합니다. – shanethehat

+0

무엇이 잘못되었는지 알아 보려면'removeAllComponents()'와'addNewComponent()'에있는 코드를 봐야합니다. 또한, 아마도'addComponentOnCalculatedArea()'. – iND

답변

1

사용할 수있는시기를 알기 위해서는 구성 요소 수명주기를 고려해야합니다. 메뉴 객체의 creationComplete 이벤트가 발생할 때까지 마우스 이벤트를 추가하지 마십시오.

이벤트에 신경 쓰지 않으면 많은 비동기 문제가 발생합니다. 이것이 비동기식 애플리케이션의 기본입니다!

정상적으로 작업을 완료하면 플래그를 설정해야합니다. addMenu가 끝나기 전에 removeMenu를 평가하지 않게하는 것이 중요하다면 다음과 같이해야합니다 :

private function start():void{ 
    _menu = new MyMenu(); 
    _menu.addEventListener(FlexEvent.CREATION_COMPLETE, eventHandler); 
    _screen.addElement(_menu); 
} 

private function eventHandler(...rest):void{ 
    _menuCreated = true; 
    _menu.removeEventListener(FlexEvent.CREATION_COMPLETE, eventHandler); 
} 

private function menuClick(event:Event):void{ 
    if(!_menuCreated){ 
     return; 
    } 

    removeMenu(); 
    addMenu(event.SomethingPassedByTheClick); 
} 

이 라인에 뭔가가 있습니다.

또한 RemoveMenu를 기다리는 AddMenu에 대해 언급했습니다. as3은 비동기식이지만 단일 스레드입니다. 동시에 여러 기능을 평가하지 않아도됩니다. RemoveMenus가 실행될 때 AddMenu는 실행되지 않습니다.

우리는이 이렇게되어 있습니다이 명확하게하려면 : 당신이 상관없이 doThings를 호출하지 않는 경우는 항상 다음 "최초의"인쇄이 예제에서는

private function doFirst():void{ 
     trace("first"); 
    } 

    private function doSecond():void{ 
     trace("second"); 
    } 

    private function doThings():void{ 
     doFirst(); 
     doSecond(); 
    } 

을 "두 번째는"doFirst는 데 걸리는 시간. doFirst에 무한 while 루프가 있으면 아무 것도 흐름 제어를 중단하지 않고 전체 응용 프로그램을 정지시킵니다.

지금 doFirst() 몇 가지 이벤트를 전달하고 asynchornously 다음은 doSecond 아니라 doFirst 함수의 마무리 후 일어날 수있는 전달 일을 일을해야하는 경우. 이 경우 doFirst의 모든 작업이 완료된 후에 doSecond에 대한 이벤트 리스너를 등록해야합니다.

앞서 언급 한 것처럼 작업의 이벤트 처리기에서 플래그를 설정하면 구성 요소의 속성을 무효화 할 수 있습니다. 그러면 commitProperties으로 전화가 걸리며 다음 항목을 수행 할 수 있습니다.

구성 요소의 비동기 수명주기를 설명하는 링크 인 http://livedocs.adobe.com/flex/3/html/help.html?content=ascomponents_advanced_3.htmlhttp://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#commitProperties()을 확인하고 속성을 비동기 적으로 설정하는 방법을 확인하십시오.

+0

메뉴가 아직 작성되지 않은 경우 클릭을 생성 할 수 없으므로 정확히는 아닙니다. 내 문제는 첫 번째 메뉴가 이미 생성 된 후에 발생합니다. 첫 번째 파일을 제거하고 두 번째 파일을 만들려면 먼저 파일을 제거한 다음 순차적으로 추가 한 다음 다른 파일을 추가하고 싶습니다. 싱글 스레드에 대해서, 나는 그것을 알고있다. 그러나 비동기 적 이유로 addMenu()가 removeMenus() 전에 실행되는 경우가 있습니다. –

+0

메뉴를 어떻게 지우시겠습니까? 부모 구성 요소 하위 목록에서 제거하고 있습니까? 팝업인가요? 좀 더 많은 샘플 코드를 사용하면 더 나은 대답을 줄 수 있습니다. – devshorts

+0

addMenu는 removeMenu를 비동기로 만들지 않으면 removeMenu가 완료 될 때까지 기다립니다. 어떤 경우에는 addMenu를 사용하여 완성 된 모든 이벤트를 듣고 그 방식으로 동기화해야합니다. – devshorts

1

나는 devshorts '대답에 동의하지만, 마지막 함수 나뿐만 아니라 콜백을 추가 :이 메뉴 제거 전에 새로운 메뉴를 추가로 완료되었는지 확인하기 위해 도움이 될

private function menuClick(event:Event):void{ 
    if(!_menuCreated){ 
     return; 
    } 
    removeMenu.addlistener(someCompleteEvent, menuRemoved); // Don't add until you are sure. 
} 

private function menuRemoved (SomethingPassedByTheClick: ClickEvent): void{ 
    addMenu(event.SomethingPassedByTheClick); 
} 

.

관련 문제