1

オブジェクトはオブジェクトのAメソッドMを呼び出しB、2つの場合に2つのコールバックを渡します:cbYescbNo

B次に、Webサービスの非同期呼び出しを実行Cし、唯一のコールバック:メソッドNでオブジェクト(api)インスタンスを作成しますB。このコールバックは、2つのコールバックのどちらを呼び出すかを決定します。

私はタイプのBのプライベート変数として保存cbYesして機能します。cbNoFunction

どちらのコールバックを呼び出すことができますか?それらはBの子ではないので、構文B[cbYes]();は方法ではありません。非現実的なコード例:

class A {
    public function Smth() {
        var instB:B = new B( cbYes, cbNo);
    }
    public function cbYes( e:Event) { doSomething(); }
    public function cbNo( e:Event) { doSomething(); }
}

class B {
    private var _cb1:Function;
    private var _cb2:Function;
    public function B( cb1, cb2) {
        _cb1 = cb1; _cb2 = cb2;
        var worker:C = new C();
        C.apiMethod123( cbAfterCall);
    }
    public function cbAfterCall( Result:*) {
        if( Result = 1) {
            // here I need to call callback from _cb1
        } else {
            // here I need to call callback from _cb2
        }
    }
}

class C {
    private var _Callback:Function;
    public function C() { }
    public function apiMethod123( cb:Function) {
        this._Callback = cb;
        // create a URLLoader or a Loader and do a web service call
    }
    public function urlCallback( e:Event) {
        // parse response
        this._Callback();
    }
}

わかりました。このサンプルコードをまとめているときに、API呼び出し元のワーカーですでにこれを解決していることに気付きました。:-)もっと睡眠をとるようになりました。

AfterQuestion:このアーキテクチャのアプローチは本当に間違っているように見えますか?より良いもの、または同時非同期API呼び出しが使用されるシステムに適したパターンをアドバイスしてください。

4

1 に答える 1

2

cbYesとcbNoをメンバー変数としてB内に格納する場合、通常の関数のように呼び出すことができます。

public function foo(cbYes:Function,cbNo:Function):void
{
    this.cbYes = cbYes;
    this.cbNo = cbNo;
}

public function bar():void
{
    cbYes();
}

このようなコールバックを使用する代わりに、イベントシステムを使用して同じ結果を得ることができます。カスタムイベントを作成し、yes/noイベントをディスパッチできます。

于 2012-05-16T16:14:51.827 に答える