それは悪い質問ではありません。しかし、あなたのコントロールの流れを完全にゴミ箱に入れなければならないという点で、いくつかの方法があります。注:私はそれがきれいだったとは言わなかった。
は、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などのインスタンスを含む必要があると考える傾向があります。サブインスタンスを作成するインスタンスは、そのサブインスタンスがどのように作成されるかについてある程度の制御が必要ですサブインスタンスを完全に決定させるのではなく、それが意味をなさないならば:-(
この時点で私はちょっと散歩しているように感じる...誰かが問題を説明することを望むことになる
いくつかの例(コード付き)は(私にとっては)うれしいでしょう。 –
これはコールバックの目的ではありませんか?これがあなたが求めているものなら、私はそれをあまり得ていませんでした。 – Bakudan