3

別々にしておきたいメソッドを持ついくつかの異なるJavaScriptオブジェクトがあります。ただし、これらのメソッドを正しいタイミングでトリガーできるように、ある種のオブザーバー、コールバック、またはプラグインの設計が必要です。

たとえば、A.Foo()ほとんどの場合、後を実行する 必要がありますが、後を実行してはならないという奇妙な場合があるため、内部B.Bar()に電話をかけたくありません 。それは私のコードを結合することになるでしょう、そして私はそれが悪いことを知っています。A.Foo() B.Bar()B.Bar()

私は、あたかもそれが仕事をしているようにこの問題に取り組みたいと思っており、それと一緒にタグ付けしたいと思うかもしれない他の機能B.Bar()について知ることを計画していません。A.Foo()言い換えれば、将来の開発者のためのプラグインサポート。

Javascriptでオブザーバーまたはイベントベースのコールバックを使用して、モジュール式の非結合コードをどのように設計しますか?

4

2 に答える 2

2

シナリオが実際にイベントのようなものなのか、それとも非同期操作のようなものなのかによって異なります。

イベントベース

マイクロイベントのようなものを使用すると、次のことができます。このパターンは非常に一般的で単純なので、理解の観点からは素晴らしいので、ある時点でこれを自分で実装することをお勧めします。

MicroEvent.mixin(A);

A.Foo = function () {
  //Do stuff A needs to do, then:
  A.trigger('foo-complete');
};

//Somewhere nice and separate and decoupled
A.bind('foo-complete', B.Bar);

イベントのフィルタリング、イベントのマッピングなど、より複雑なことを行う必要がある場合。ReactiveExtensions(C#ライブラリに基づく)は非常に強力ですが、機能が必要ない場合は、ロードするための大きなライブラリです。

非同期操作

コールバックの使用

これは、コールバックを使用して実行できます。これは、かなり単純な操作に最適です。

A.Foo = function (cb) {
  //Do stuff A needs to do, then:
  if (cb) cb();
};

A.Foo(B.Bar);

約束の使用

これらは最初はより複雑に見えますが、簡単に構成でき、エラーを処理するための優れた方法が組み込まれています。

最も人気のあるpromiseライブラリの1つであるQを使用します(ここでも、これらがたくさんあります)。

A.Foo = function () {
  var def = Q.defer();
  setTimeout(function () {
    //Simulate async operation
    def.resolve();
  }, 1000);
  return def.promise;
};

A.Foo().then(B.Bar).end();

制御フローライブラリの使用

制御フローライブラリ(おそらくpromiseはこれの特殊なケースです)は、コールバックシステムに基づく操作の作成を支援することを目的としています。

于 2012-08-28T17:17:14.223 に答える
0

Dojoを使用すると、関数呼び出しを聞くことができます。

dojo.connect("foo", A, function(){
  B.bar();
});
于 2012-09-03T11:43:13.797 に答える