2016-12-16 15 views
6

現在、テキストファイルに行を読み書きする小さな永続キューライブラリを作成しています。ここで追加の方法は、例えば、次のとおりです。私はかなり厄介な見つけるものを、イベントエミッタとコールバック(またはイベントのエミッタとの約束を)Observablesを永続キューライブラリに実装する

Queue.prototype.add = function(line, cb){ 

    getLock(this, err => { 
     if(err){ 
      this.emit('error', err); 
      releaseLock(err, cb); 
     } 
     else{ 
      fs.appendFile(this.filepath, line, err => { 
       err && this.emit('error', err); 
       releaseLock(err, cb); 
      }); 
     } 
    }); 
}; 

支援しています。

つまり、キュー上の各メソッド(add、peek、remove)に対して、各呼び出しに固有の結果を返す/コールバックする必要があります。イベント・エミッターを使用することは、呼び出し元が、直前の呼び出しに固有ではない結果に作用する可能性があることを意味します。だからここでのコールバックや約束は不可欠のようだ。イベントエミッタだけを使うことはできない。

私は不思議に思うことは、何らかの形で、コールバックをイベントエミッタまたはイベントエミッタで約束しなければならないという問題を解決できるかどうかです。

私は、このイベント/非同期キューを実装する方法を見出すために、1つのタイプの非同期コールバックメカニズムを使用します。たぶんobservablesはここの答えではありませんが、私は良いデザインパターンを探しています。

答えて

2

ここでイベントエミッタをなぜ必要としているのかよく分かりません....あなたがobservablesを使用する場合、各サブスクライバは自分の呼び出しから結果/エラーを取得します。

私のようなあなたの方法を書き換えます:私は、ストリームが内部の副作用を持っていることを誇りに思っていないよ、このソリューションでは

function appendFileObs(filePath, line){ 
    return Rx.Observable.create((obs) => { 
     fs.appendFile(filePath, line, (err, result) => { 
      if(err) obs.onError(err); 
      else { 
       obs.onNext(result); 
       obs.onCompleted(); 
      } 
     }); 
    }); 
}); 
// Similar for getLock and releaseLock 


Queue.prototype.add = function(line){ 
    return getLockObs(this) 
     .flatMap(() => appendFileObs(this.filePath, line)) 
     .flatMap(result => releaseLockObs(undefined).map(() => result)) 
     .catch((err) => { 
      return releaseLockObs(err); 
     }); 
}; 

を、それはおそらく、改善可能だが、あなたのアイデアを得ます。

このようにして、誰かが.add(line).subscribe()を呼び出すと、結果とその呼び出しで発生したエラーが取得されます。あなたが起こるエラーをブロードキャストする必要がある場合は、あなたがBehaviourSubjectを使用することができます

は、それが同時に観測し、観測可能だ

+0

おかげで、これは私を助けます(有用なものを!) - ものための方法がありますキューが出すすべてのイベント(オブザーバブルを使用)をリッスンするリスナ?少なくともこれはデバッグに便利です。 –

+0

ああ、 "BehaviorSubject"を暗示することで既に私の質問に答えたと思います –

+0

私はobservablesを使ってメソッドを連鎖させることはできないと思います。例えば:queue.add(line1).add(line2).add(line3).subscribeまたはそれは? –

関連する問題