2010-05-07 10 views
3

에서 AsyncToken 관련 반환에 (MSG : RssEvent) : AsyncToken 관련 { 을 AsyncToken으로 service.list()를 반환하십시오. }어떻게 가짜 내가이 를 통해 액세스 서비스 [명령 (선택 = '목록')] 공공 기능 getRssFeed이 파슬리, 를 사용하여 액션 스크립트 3

"실제"RssService를 가리키면 모든 것이 예상대로 작동합니다. 내 문제는 "모의"RssService를 가리킬 때입니다. 일부 더미 데이터 반환 AsyncToken 가짜 방법을 알아낼 수 없습니다 ...이 작업을 수행하는 방법을 아는 사람이 있습니까?

답변

4

는 .............. 해결)

public function list():AsyncToken 

    var rssFeed:Array = [rss,rss,rss]; 
    var token:AsyncToken = createToken(rssFeed); 
    token.addResponder(new AsyncResponder(resultHandler, null)); 
    return token; 

    } 

    private function resultHandler(event:ResultEvent, token:AsyncToken = null):void 
    { 
    event.token.dispatchEvent(event); 
    } 


    protected function createToken(result:Object):AsyncToken 
    { 
    var token:AsyncToken = new AsyncToken(null); 
    setTimeout(applyResult, Math.random()*500, token, result); 
    return token; 
    } 

    private function applyResult(token:AsyncToken, result:Object):void 
    { 
    mx_internal:token.setResult(result); 
    var event:ResultEvent = new ResultEvent(ResultEvent.RESULT, false, true, result, token); 
    mx_internal:token.applyResult(event); 
    trace(token); 
    } 
+2

"use namespace mx_internal;"를 추가하십시오. 너의 모의 서비스에. 아래 답변에서 Tim에게 감사드립니다. – mbseid

1

추가하는 것을 잊지 마십시오

use namespace mx_internal;

그렇지 않으면이 예외를 얻을 것이다 .

[오류] 예외, 정보 = TypeError : 오류 # 1006 : setResult가 함수가 아닙니다. 나는 다음과 같은 방법으로 ServiceProxy을 확장

  • mockFaultInvokeOperation
    • invokeOperation
    • mockResultInvokeOperation :

    1

    나는 기본적으로 3 가지 방법을 제공하는 ServiceProxy 패턴의 일종을 사용

    public class SomeService extends ServiceProxy { 
        public var useMock:Boolean; 
    
        public function someServiceCall(arg1:Type, arg2:Type, responder:IResponder):AsyncToken { 
         if (useMock) { 
          mockResultInvokeOperation({some fake result object}, responder); 
         } 
    
         return invokeOperation("someServiceCall", [arg1, arg2], responder); 
        } 
    
    } 
    

    기술면에서 나는 당신과 똑같은 트릭을 사용합니다. mx_internal 수입

    public class MockCommand 
    { 
        public var callback:Function; 
    
        public function execute():void 
        { 
         var timer:Timer = new Timer(500, 1); 
         timer.addEventListener(TimerEvent.TIMER_COMPLETE, timer_completeHandler); 
         timer.start(); 
        } 
    
        private function timer_completeHandler(event:TimerEvent):void 
        { 
         callback(mockResultData); 
        } 
    } 
    

    필요가 없습니다 :

    package com.obecto.services.proxy 
    { 
    import flash.utils.setTimeout; 
    
    import mx.core.mx_internal; 
    import mx.messaging.messages.RemotingMessage; 
    import mx.rpc.AbstractOperation; 
    import mx.rpc.AbstractService; 
    import mx.rpc.AsyncToken; 
    import mx.rpc.Fault; 
    import mx.rpc.IResponder; 
    import mx.rpc.events.FaultEvent; 
    import mx.rpc.events.ResultEvent; 
    
    public class ServiceProxy 
    { 
        public var service:AbstractService; 
    
        public function invokeOperation(operationName:String, arguments:Array, responder:IResponder):AsyncToken 
        { 
         var operation:AbstractOperation = service.getOperation(operationName); 
         operation.arguments = arguments; 
    
         var token:AsyncToken = operation.send(); 
         token.addResponder(responder); 
         return token; 
        } 
    
        public function mockResultInvokeOperation(mockResult:Object, responder:IResponder):AsyncToken 
        { 
         var fakeMessage:RemotingMessage = new RemotingMessage(); 
    
         var token:AsyncToken = new AsyncToken(fakeMessage); 
         token.addResponder(responder); 
    
         setTimeout(
          function(e:ResultEvent = null):void 
          { 
           token.mx_internal::applyResult(new ResultEvent(ResultEvent.RESULT, false, true, mockResult)); 
          }, 1000); 
    
         return token; 
        } 
    
        public function mockFaultInvokeOperation(message:String, responder:IResponder):AsyncToken 
        { 
         var fakeMessage:RemotingMessage = new RemotingMessage(); 
    
         var token:AsyncToken = new AsyncToken(fakeMessage); 
         token.addResponder(responder); 
    
         setTimeout(
          function(e:ResultEvent = null):void 
          { 
           token.mx_internal::applyFault(new FaultEvent(FaultEvent.FAULT, false, true, 
            new Fault("MOCK_FAULT", message))); 
          }, 1000); 
    
         return token; 
        } 
    
    } 
    } 
    
    3

    파슬리 3.0을 사용하면 spicefactory 비동기 명령과 함께 더 나은 옵션이 있습니다.