2012-02-04 9 views
0

トレースする必要があるコードのシンプルな作品:ActionScript 3は単純な同期アーキテクチャ言語ではありませんか?

  • が行わ
  • テスト離煙!

と私は完全に遠く離れているから何かを得る、

シナリオA:

var __functions_to_execute:Array; 

function start():void { 
    __functions_to_execute =[]; 

    __functions_to_execute.push(futile_trace()); 
    __functions_to_execute.push(futile_trace('test')); 

    execute_functions(); 
} 

function execute_functions():void { 
    if(__functions_to_execute.length){ 
     //where shift on this Array remove the first element and returns it 
     var exec:Function =__functions_to_execute.shift(); 
     exec; 

     //I tried this too, just in case 
     //__functions_to_execute[0]; 
     //__functions_to_execute.shift(); 
    } else trace("done!"); 
} 

function futile_trace(_value:String ='rien'):void { 
    trace(_value); 
    execute_functions(); 
} 

start(); 

かなりシンプル。しかし、結果は次のとおりです。

  • RIEN行わ
  • テスト

これに推奨されない機能を追加することができますし、にfutile_trace機能を変更することができます:

function futile_trace(_value:String ='rien'):void { 
    trace(_value); 
    setTimeout(execute_functions, 0); 
} 

と、結果は次のとおりです。

  • RIEN
  • テスト
  • 完了!

[OK]を、その後、私は自分自身に言った、なぜ、私はexecute_functionsを呼び出すときにスコープを変更することができないので、私が試した:

function futile_trace(_value:String ='rien'):void { 
    trace(_value); 
    extra_step(); 
} 

function extra_step():void { 
    execute_functions(); 
} 

は結果だったかと思います!ええ:

  • RIEN
  • はやりました!
  • 試験

so ?!トレース機能が悪いですか?それは遅い?関数に引数を渡すと、他の関数と比べて時間がかかりますか?私は...うわーだよ!

私はこのような奇妙さを避けるために何かできますか?

(記録のために、私のプロジェクトは、トレース{RIEN、行われ、テスト}していない...私は、「トレースステートメントを省略」かどうかでそれらをコンパイルした場合、完全に異なる反応コードの15kのラインを持っている。

ご入力のみんなのために

感謝。

答えて

3

あなたが機能を実行し、__functions_to_execute配列ではなく、機能そのものにその戻り値を追加している。

あなたの機能execute_functionsは実際には何もしません。私はシーケンスをインラインで説明しようとしました:

function start():void { 
    __functions_to_execute =[]; 
    // 1. traces 'rien' first because futile_trace() is called with no args 
    // 2. 'done!' will be traced inside execute_functions because the array is still empty 
    // 3.undefined will be pushed into the array next 
    __functions_to_execute.push(futile_trace()); 
    // 4. traces 'test' 
    // execute_functions does not trace anything because __functions_to_execute is non-empty 
    // but it also doesn't do anything because it is just removing the `undefined` value from the start of the array. 
    __functions_to_execute.push(futile_trace('test')); 

    execute_functions(); 
} 

これ以上の何かが期待どおりに動作するはずです。関数が呼び出されたときに渡される引数とともに、配列の関数参照に格納されます。シナリオAの場合

var __functions_to_execute:Array; 

function start():void { 
    __functions_to_execute = []; 

    __functions_to_execute.push({func:futile_trace, args:[]}); 
    __functions_to_execute.push({func:futile_trace, args:['test']}); 

    execute_functions(); 
} 

function execute_functions():void { 
    if(__functions_to_execute.length){ 
     var obj:Object = __functions_to_execute.shift(); 
     obj.func.apply(null, obj.args); 
    } else trace("done!"); 
} 

function futile_trace(_value:String ='rien'):void { 
    trace(_value); 
    execute_functions(); 
} 

start(); 
+0

おかげで男を、それが今ではあまり意味が、彼のリテラル形式を使用して関数を保存しようとする関数を呼び出しますし、実際の関数ではなく配列に結果(void)を格納してください! 私はこれらのテストを続けます(func、args) – Francis

+0

@Francisはデバッガを使っても役に立ちます。 –

+0

私が提案していたコードは非常にシンプルなので、トレースやその他の奇妙な非同期イベントが発生すると思われていました。しかし、あなたが正しいです、私はデバッグを使用する必要があります。 デバッグについて言えば、別の質問をここで尋ねます:私の最終的なプロジェクトは、Flash Player 10.0を搭載したLinux上でFirefox 3.0で動作するスタンドアロンアプリケーションです。ファイルとして実行しているフラッシュコンテナを不正にするためにどのツールを使用する必要がありますか(Apacheを実行していない、ローカルパスから直接firefoxにフラッシュする)任意の提案を歓迎します。ありがとう – Francis

0

、あなたは実際には、これまでの配列にfutile_traceをプッシュしていない - あなたは(関数名の後()に気づく)それを呼び出し、その後にそのコールの結果をプッシュしていますアレイ。言い換えれば

  1. あなたは何も値を渡さないためを '離煙' futile_trace()
  2. futile_traceトレースを呼び出します。
  3. futile_traceは、何もそう_execute_functionsトレース、まだプッシュされていないこの時点で_execute_functions
  4. を呼び出し、 'やりました!'
  5. _execute_functionsが返されます。
  6. _futile_traceが返されます。
  7. futile_trace()(void)の結果がプッシュされます。
  8. あなたはfutile_trace('test')
  9. futile_trace()出力'試験'を呼び出します。
  10. futile_traceコールアレイから_execute_functions
  11. _execute_functionsシフトvoid
  12. _execute_functionsは実行void;(何もしないもの)
  13. などなど

あなたはあなたがいないなら作る、別の関数に関数を渡すか、変数にそれへの参照を格納する必要がある場合それを呼び出す。

__functions_to_execute.push(futile_trace); 
// Use an anonymous function to pass with arguments without executing: 
__functions_to_execute.push(function() { futile_trace('test'); }); 

...と_execute_functionsは括弧を覚えています:

exec(); 
+0

両方の答えは良いです、あなたの助けに感謝!残念ながら私はただ1つの良い答えを割り当てることができます!しかし、あなたの説明に感謝します! :) – Francis

+0

心配はいりません - とにかく(定義されていない)JavaScriptのビットがありましたが、これは今修正されています。 ;-) – JimmiTh

関連する問題