3

以下のコードのスニペットは機能します (動作しているという意味では ;-)) が、せいぜい不十分なように見えます...

これをより構成可能にする方法、または少なくとも醜さを軽減する方法を誰かが提案できますか?

コードは、このページの例に基づいています: RxJS を使用して既存の API をラップする

function connect() {
  return rx.Observable.create(function (observer) {
    mongo.connect('mongodb://127.0.1:27017/things', function(err, db) {
      if(err) observer.onError(err);
      observer.onNext(db);
    });
  }).publish().refCount();
}

function getThings(db) {
  return rx.Observable.create(function (observer) {
    db.collection('things').find().toArray(function(err, results) {
      if(err) observer.onError(err);
      observer.onNext(results);
      observer.onCompleted();
    });
    return function () {
      db.close();
    };
  }).publish().refCount();
}


connect().subscribe(
  function (db) {
    getThings(db).subscribe(console.log);
  }, function (err) {
    console.log(err);
  }
);
4

1 に答える 1

5

この特定の例では、それgetThings()が発生した後に一度だけ発生すると仮定すると、次のようconnect()に実装を変更します。getThings()

function getThings() {
  return connect()
    .flatMap(function(db) {
      return rx.Observable.create(function (observer) {
        db.collection('things').find().toArray(function(err, results) {
          if(err) observer.onError(err);
          observer.onNext(results);
          observer.onCompleted();
        });
        return function () {
          db.close();
        };
      });
    });
}

getThings()次に、ストリームをサブスクライブできます。

getThings().subscribe(console.log);

以前flatMapは接続ステップを全体の中に隠していましたgetThings()。FlatMap のドキュメントは複雑に聞こえますが、それほど複雑ではありません。ソース Observable からのイベントを別の将来のイベントに置き換えるだけです。図で説明すると、各xイベントを将来のyイベントに置き換えます。

---x----------x------->
flatMap( x => --y--> )
------y----------y---->

私たちの場合、xイベントは「正常に接続されました」であり、y「データベースから「もの」を取得しました」です。


とはいえ、アプリの動作方法に応じて、これを行うにはいくつかの方法があります。RxJS は連鎖可能な Promise の代わりではなく、「強化されたイベント バス」と考える方が適切です。実際には後者ではないからです。

「アプリで発生するすべてのこと」をイベントのストリームとしてモデル化する場合は、RxJS での開発が最適です。適切に実行された場合、これらの連鎖可能な「これを実行し、次にそれを実行し、次にそれを実行する」と表示されることはありません。これは、最終的には命令型のパラダイムであり、RxJS はそれ以上の機能を備えているためです。理想的には、宣言的な方法で、イベントが何であるかを伝えることについてもっとすべきです。詳細な説明、特に「まとめ」セクションの談話については、このチュートリアルを参照してください。また、この要点が役立つ場合があります。

于 2014-08-15T13:16:52.147 に答える