2012-04-06 6 views
6

1つのメソッドをconstとマークして、それが呼び出されたすべてのメソッドにconstとマークしなければならないことをC++で覚えておいてください。彼らが呼んだメソッド、など?非同期中毒 - 私は唯一の被害者になることはできません

私はそれが関係ないと思うが、それはむしろダウンよりアップ伝播するが、私は、JavaScriptで、非同期中毒の問題を抱えています。ある関数が非同期関数を呼び出す可能性がある場合、それ自体は非同期として書き直されなければならず、それを呼び出すすべての関数が同じでなければなりません。

私はここに整形疑問を持っていない

(申し訳ありませんが、改造)が、私は期待していた誰かが(a)の場合があります(a)の助言または(b)参照のいずれかを持っていました。

+1

いくつかの例(コード付き)は(私にとっては)うれしいでしょう。 –

+0

これはコールバックの目的ではありませんか?これがあなたが求めているものなら、私はそれをあまり得ていませんでした。 – Bakudan

答えて

1

私が今までに見てきた最良の解決策は、promisesです。もちろん、約束どおりの中立的な中毒に対処するということです。しかし、約束はコールバックよりはるかに柔軟で強力です。

0

問題は、(Bである場合には)(完了するまでブロックが、非同期を呼び出す必要があります)、おそらく()からコールバック(フラグとBを設定することができ)フラグを監視します。 a()がコールバックを提供しない場合は、おそらくa()が完了した後に変更される値があります。

2

それは悪い質問ではありません。しかし、あなたのコントロールの流れを完全にゴミ箱に入れなければならないという点で、いくつかの方法があります。注:私はそれがきれいだったとは言わなかった。

は、BはCの getCDataメソッドを呼び出して、あなたは、B、CおよびD、 A.Amethodは戻らないものをオブジェクトとメソッドBの getBData呼び出していると仮定し、問題はCはそう

のようなDの何かを呼び出していましたさ

01:
var data = D.getRawData(); 
... something to be done with data ... 
... something else to be done with data... 

とは、今では、コードのように見えるために使用されるコードのように、あなたは常に、あなたの各メソッドにコールバックパラメータを追加することができ、うまく

D.getData(function(data){ 
    ... something to be done with data ... 
    ... something else to be done with data... 
}); 

のように書かれなければなら

var A = { 
//I'm not recommending coding like this, just for demonstration purposes. 
... 
    Amethod: function(x,y,z){ 
     var somethingForA = this.B.getBData(1,2,3); 
     astatement1; 
     astatement2; 
     ... 
    } 
    ... 
    }  
    //end of A 
    ... 
var B = { 
... 
    Bmethod: function(x,y,z){ 
     var somethingForB = this.C.getCData(1,2,3); 
     bstatement1; 
     var somethingFromB = bstatement2; 
     return somethingFromB; 
    } 
    ... 
    }  
    //end of B 
    ... 
var C = { 
... 
    Cmethod: function(x,y,z){ 
     var somethingForC = this.D.getRawData(1,2,3) 
     cstatement1; 
     var somethingFromC = cstatement2; 
     return somethingFromC; 
    } 
    ... 
    }  
    //end of C 
    ... 

あなたが今持っていると思います:

かなり多くの制御のあなたの流れを維持するすべての機能を実装するために無名関数を使って簡単なリファクタリングだ
var A = { 
    ... 
    Amethod: function(x,y,z){ 
     this.B.getBData((1,2,3,function(somethingForA){ 
      astatement1; 
      astatement2; 
     }); 
     ... 
    } 
    ... 
    }  
    //end of A 
    ... 
var B = { 
... 
    Bmethod: function(x,y,z,callback){ 
     this.C.getCData(1,2,3,function(somethingForB){ 
      bstatement1; 
      var somethingFromB = bstatement2; 
      callback(somethingFromB); 
     }); 
     ... 
    } 
    ... 
    }  
    //end of B 
    ... 
var C = { 
... 
    Cmethod: function(x,y,z,callback){ 
     this.D.getRawData(1,2,3,function(somethingForC) { 
      cstatement1; 
      var somethingFromC = cstatement2; 
      callback(somethingFromC); 
     }); 
    } 
    ... 
    }  
    //end of C 
    ... 

。私は文字通りどのように変換されるのか分かりません。可変範囲の調整が必要な場合があります。そして明らかに、それほど美しいものではありません。

が他の方法はありますか?確かに。ご覧のとおり、上記は面倒です。私たちは面倒なコードを書くことを避けたいと考えています。どのくらい面倒なのかは、文脈によって決まる。

コールバックパラメータを渡す必要はありません。必要なコールバックを事前にオブジェクトに渡すことも、のパラメータとしての1つとして渡すこともできます。コールバックは直接呼び出す必要はありませんが、使用可能なさまざまなイベント処理メソッドの1つを使用して間接的に呼び出すことができます(これは、使用したいライブラリを見てください)、データはイベントがトリガされます。あるいは、データが "仲介者B"と​​ "C"を完全に避けるためにコールバックを登録できるグローバルな "DataGetter"があるかもしれません。

最後に、非同期的にしか得ることのできないものが必要であり、そのデータがコマンドのチェーンの上を渡されなければならない場合、オブジェクトがプログラムロジックの流れを制御すべきであるという点で少し後退しているかもしれません(私は正直なところ、なぜこのシナリオが問題であると思われるのかを記述する方法まで。)。私は、AのインスタンスはBのインスタンスを含む必要があり、BはBなどのインスタンスを含む必要があると考える傾向があります。サブインスタンスを作成するインスタンスは、そのサブインスタンスがどのように作成されるかについてある程度の制御が必要ですサブインスタンスを完全に決定させるのではなく、それが意味をなさないならば:-(

この時点で私はちょっと散歩しているように感じる...誰かが問題を説明することを望むことになる

関連する問題