2011-07-28 5 views
2

저는 더 많은 이벤트 중심 환경에 익숙하지만 현재는 함수 호출로 모든 것을 사용하고 있습니다. 내가 이것에 대해 물었을 때 데비안 중 하나는 콜백이 버블 링으로 인해 더 빠르기 때문에라고했지만 버블 링 속성은 항상 false로 설정할 수있었습니다 ...빠른 방법으로 함수 콜백을 찾을 수 있습니다 ...

그래서 어떤 문제인지 알아 내려고 노력하고 있습니다. 콜백 함수가 참조되고 있습니다.

public class A { 
    public function A(){} 
    public function func_1():Number{ return 1; } 
    public function func_2():Number{ return 2; } 
    public function doSomething:Function{ 
     if(Math.random > 0.5) return func_1; else return func_2; 
    } 
} 

가 그럼 난 클래스 B의 코드를 실행할 수 있습니다 : I 조치를받을 BI 내부에 브레이크 포인트를 넣을 때 (34567 @) = 그래서 기능을

public class B{ 
    public var a:A = new A(); 
    private var action:Function; 
    public function B(){ action = a.doSomenthing(); } 
} 

을 예를 들어

정말 완전히 쓸모가 없다 ... 나는 func_1과 func_2 둘 다에 중단 점을 넣을 수 있다는 것을 알았지 만, 나는 이것을 일반적인 예제로 사용하고있다. 함수 콜백이 코드를 통해 분산되어있다 ... 이름을 얻는 방법이있다. 함수의 메모리 주소로? 감사합니다

나는 당신이 스택 추적에 대해 무엇을 말하고 있는지 알고 있습니다. 하지만 코드의 기능을 물리적으로 단계적으로 수행해야합니다. 아래 예제에서는 콜백()에 중단 점을 넣어야합니다. 스택 추적 업데이트를 보려면이 단계를 건너 뜁니다. 문제는 호출되기 전에 콜백을 알고 싶습니다. 때때로 그들은 다른 장소에서 부름을 받는다. 콜백을받을 수있는 다른 방법은 없습니까?

public var callbacks:Array = []; 
public function loadURL(url:String, callback:Function){ 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
    callbacks.push(callback); 
    var request:URLRequest = new URLRequest(url); 
    loader.load(request); 
} 

public function completeHandler(event:Event):void 
{ 
    for(var i:int = 0; i < callbacks.length; i ++){ 
     var callback:Function = callbacks[i]; 
     callback(); 
    } 
} 
+0

봐 :

그리고 여기에 후대에 대한 코드의 기술이다. –

+0

콜백을 너무 자주 사용하지만, asdoc 주석도 사용하기 때문에 이전에는 문제가 없었습니다. 또한 콜백은 클래스에서'Function' 유형의 유일한 변수 일 수 있으므로 쉽게 식별 할 수 있어야합니다. 나는 당신의 예가 공공의 재산을 사용하고있는 것을 본다. 나는 보호 된 변수와 getter/setter를 대부분 사용하고있다.도움이된다면 다음과 같이 할 수 있습니다. public function getFunctionVars (instance : *) : XMLList { \t \t \t return describeType (instance) .method. (@ returnType == "Function"); \t \t} '...하지만 작업하는 코드는 가능한 한 간단하고 문서화해야합니다. –

답변

2

이 믿을 수 없을만큼 남았습니다 코드이지만,이 예제를 위해 디버거에서 호출 스택을 사용할 수 있습니다

enter image description here

귀하의 예제 코드는 많은 문제가 있었다, 그러나이 캡처는 미성년자를 기반으로 구현에 대한 비틀기 :

package 
{ 
    import flash.display.Sprite; 

    public class MultiCallback extends Sprite 
    { 
     public function MultiCallback() 
     { 
      super(); 

      var b:B = new B(); 
      b.action()(); 
     } 
    } 
} 


internal class A 
{ 
    public function A() 
    { 
    } 

    public function func_1():Number 
    { 
     return 1; 
    } 

    public function func_2():Number 
    { 
     return 2; 
    } 

    public function doSomething():Function 
    { 
     if (Math.random() > 0.5) 
      return func_1; 
     else 
      return func_2; 
    } 
} 

internal class B 
{ 
    public var a:A = new A(); 

    public var action:Function; 

    public function B() 
    { 
     action = a.doSomething; 
    } 
} 
1

남자는 동일한 보트에 있습니다. 이 코드베이스는 거대하고 동일한 방식으로 수행됩니다. "뿌려진"것은 나의 경우에는 삼가면서 말하는 것이다. 함수 객체에 함수 이름 핸들러가 없으면 SOL입니다. 코드를 통해 내 방식을 이해할 수있는 방법 중 하나는 UML을 사용하여이 다른 클래스를 표현하고 연관 연산자를 사용하여 이것이 무엇인지를 보여주는 것입니다. 콜백이 다른 콜백을 호출 할 때 잃어 버리기가 쉽습니다. UML 다이어그램을 만들면 빵 부스러기가 토끼 구멍에서 벗어나려고하는 것과 같습니다. 잠시 후, 당신은 그것에 익숙해집니다. 나는이 프로그래밍 방식을 채택 할 것인가? 지옥 아니, 그들은 단지 다음 사람이 유지하기가 더 어려워졌습니다. Violet UML을 사용하여 콜백을 통한 여정을 추적합니다.

2

당신은 시도 내부 오류가 발생 할 수 있습니다 ... 캐치를 응용 프로그램을 죽이지 않고 스택을 검사 할 수 있도록. 이 해결책은 나를 위축 시키지만, 동시에 그것은 아주 교활합니다. 원래 랄프 Bokelberk에 의해,하지만 그의 블로그는 현재 작동하지 않습니다 이후 I'll link to here instead, 내가 그것을 발견 어디입니다. 디버거에서 호출 스택에서

var stackTrace:String; 

try { throw new Error(); } 
catch (e: Error) { stackTrace = e.getStackTrace(); } 

var lines:Array = stackTrace.split('\n'); 
var isDebug Boolean = (lines[int(1)] as String).indexOf('[') != int(-1); 

var path:String; 
var line:int = -1; 

if (isDebug) { 
    var regex:RegExp = /at\x20(.+?)\[(.+?)\]/i; 
    var matches:Array = regex.exec(lines[int(2)]); 

    path = matches[int(1)]; 

    //file:line = matches[2] 
    line = matches[int(2)].split(':')[int(2)];//windows == 2 because of drive:\ 
} else { 
    path = (lines[int(2)] as String).substring(4); 
} 
관련 문제