ActionScript 3/Flex/AIR에서 1:1 비동기 콜백/이벤트를 구현하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/53025

문제

나는 ~을 활용해왔다. 명령 패턴 내 Flex 프로젝트에서는 다음 사이에 비동기 콜백 경로가 필요합니다.

  • 주어진 명령 개체와 명령 개체를 인스턴스화한 사람은 누구나
  • 명령 개체와 "데이터 액세스" 개체(예:원격 프로시저를 처리하는 사람은 네트워크를 통해 명령 개체가 호출하는 서버를 호출합니다.

이 두 콜백 경로는 각각 일대일 관계가 가능해야 합니다.이는 정확히 동일한 작업을 동시에 실행하지만 약간 다른 매개변수를 사용하여 특정 명령 클래스의 여러 인스턴스가 있을 수 있고 해당 콜백이 혼동되는 것을 원하지 않기 때문입니다.AS3에서 비동기성을 처리하는 기본 방법인 이벤트를 사용하는 것은 본질적으로 일대다 관계를 기반으로 하기 때문에 거의 사용되지 않습니다.

현재 나는 이것을 사용하여 이것을했습니다 콜백 함수 참조 특정 종류의 서명이 있는데 궁금합니다. 누군가가 더 나은(또는 대안) 방법을 알고 있다면?

다음은 현재 방법을 설명하는 예입니다.

  • 나는 DeleteObjectCommand 일부 사용자 작업으로 인해 두 개의 전용 멤버 함수(성공용, 실패용)에 대한 참조를 전달하는 인스턴스입니다.의 말을하자 "deleteObjectSuccessHandler()" 그리고 "deleteObjectFailureHandler()" 이 예에서는) 명령 클래스의 생성자에 대한 콜백 함수 참조로 사용됩니다.
  • 그런 다음 명령 개체는 "데이터 액세스" 개체에 대한 연결을 통해 이 패턴을 반복합니다.
  • 네트워크를 통한 RPC가 성공적으로 완료(또는 실패)되면 적절한 콜백 함수가 먼저 "데이터 액세스" 개체에 의해 호출된 다음 명령 개체에 의해 호출되므로 마지막으로 첫 번째 작업을 인스턴스화한 뷰 개체가 호출됩니다. 장소는 알림을 받습니다. deleteObjectSuccessHandler() 또는 deleteObjectFailureHandler() 라고 불리는.
도움이 되었습니까?

해결책

한 가지 더 아이디어를 시도해 보겠습니다.

RPC 호출에서 제공되는 AsyncToken 대신 데이터 액세스 개체가 자체 AsyncToken(또는 보류 중인 호출을 캡슐화하는 다른 개체)을 반환하도록 합니다.따라서 DAO에서는 다음과 같이 보일 것입니다(매우 개략적인 코드입니다).

public function deleteThing( id : String ) : DeferredResponse {
    var deferredResponse : DeferredResponse = new DeferredResponse();

    var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);

    var result : Function = function( o : Object ) : void {
        deferredResponse.notifyResultListeners(o);
    }

    var fault : Function = function( o : Object ) : void {
        deferredResponse.notifyFaultListeners(o);
    }

    asyncToken.addResponder(new ClosureResponder(result, fault));

    return localAsyncToken;
}

그만큼 DeferredResponse 그리고 ClosureResponder 물론 수업은 존재하지 않습니다.자신의 것을 발명하는 대신 사용할 수 있습니다 AsyncToken 대신에 DeferredResponse, 이지만 공개 버전은 AsyncToken 응답자를 트리거할 방법이 없는 것 같으므로 어쨌든 하위 클래스로 분류해야 할 것입니다. ClosureResponder 단지 구현일 뿐이다. IResponder 성공 또는 실패 시 함수를 호출할 수 있습니다.

어쨌든, 위의 코드가 업무를 수행하는 방식은 RPC 서비스를 호출하고 보류 중인 호출을 캡슐화하는 개체를 생성하고 해당 개체를 반환한 다음 RPC가 반환될 때 클로저 중 하나를 반환하는 것입니다. result 또는 fault 호출되고 RPC 호출이 이루어졌을 때와 마찬가지로 범위에 대한 참조가 여전히 있으므로 보류 중인 호출/지연된 응답에 대해 메서드를 트리거할 수 있습니다.

명령에서는 다음과 같이 표시됩니다.

public function execute( ) : void {
    var deferredResponse : DeferredResponse = dao.deleteThing("3");

    deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
    deferredResponse.addEventListener(FaultEvent.FAULT,   onFault);
}

또는 패턴을 반복하여 execute 메서드는 명령이 DAO에서 가져오는 지연된 응답이 트리거될 때 트리거되는 자체 지연된 응답을 반환합니다.

하지만.나는 이것이 특별히 아름답다고 생각하지 않는다.이런 종류의 문제를 어느 정도 정확하게 해결하기 위해 존재하는 많은 애플리케이션 프레임워크 중 하나를 사용하면 더 훌륭하고 덜 복잡하며 덜 얽힌 작업을 수행할 수 있습니다.내 제안은 친구.

다른 팁

다음과 같은 많은 Flex RPC 클래스 RemoteObject, HTTPService, 등.반품 AsyncToken당신이 그들에게 전화할 때요.이것이 당신이 추구하는 것 같습니다.기본적으로 AsyncToken 보류 중인 호출을 캡슐화하여 콜백을 등록할 수 있도록 합니다(다음 형식으로). IResponder 인스턴스)를 특정 통화로 연결합니다.

의 경우 HTTPService, 전화할 때 send()AsyncToken 이 반환되며 이 개체를 사용하여 특정 통화를 추적할 수 있습니다. ResultEvent.RESULT, 어떤 통화인지에 관계없이 트리거됩니다(그리고 통화는 전송된 순서와 다른 순서로 쉽게 들어올 수 있습니다).

AbstractCollection은 Flex/AIR에서 영구 객체를 처리하는 가장 좋은 방법입니다.GenericDAO가 이에 대한 답을 제공합니다.

DAO는 CRUD 작업을 수행하는 객체 및 valueObject (Java의 Pojo라고 함)를 통해 수행 할 기타 공통 작업을 수행하는 객체입니다.GenericDAO는 일반적으로 사용할 수 있는 재사용 가능한 DAO 클래스입니다.목표:

Java IBM GenericDao에서 새로운 DAO를 추가하려면 수행해야 할 단계는 간단히 값을 추가하는 것입니다.valueobject에 대한 hbm.xml 매핑 파일을 추가합니다.DAO에 대한 10줄 Spring 구성 파일을 추가합니다.

마찬가지로 AS3 Project Swiz DAO에서도 마찬가지입니다.우리는 비슷한 성취를 이루고 싶습니다.

클라이언트 측 GenericDAO 모델:클라이언트측 언어를 작업하면서 (모든 valueObject에 대해) 영속 객체 Collection을 관리해야 합니다.용법:원천:http://github.com/nsdevaraj/SwizDAO

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top