2017-10-30 13 views
0

を返すコードサンプルです:Baconjsはここだけで、最後のデバウンス値

let watcher; 
const streamWatcher = bacon.fromBinder(sink => { 
    watcher = chokidar.watch(root, { 
     ignored: /(^|[\/\\])\../ 
    }); 
    watcher.on('all', (event, path) => { 
     sink({ 
      event: event, 
      path: path 
     }); 
     return() => { 
      watcher.unwatch(root); 
     }; 
    }); 
}); 
streamWatcher 
    .skipDuplicates(_.isEqual) 
    .map('.path') 
    .scan([], (a, b) => { 
     a.push(b); 
     return a; 
    }) 
    .debounce(300) 
    .onValue(files => { 
     if (files.length) { 
      console.log('change event fired'); 
      tinyLrSrv.changed({ 
       body: { 
        files: files 
       } 
      }); 
     } 
    }); 

私がやろうとしていますどのようなラップするBacon.jsを使用して、フォルダの変更(開発中のウェブディレクトリ)を見て、デバウンスchokidarを使用することです(私は各ファイルの変更を知りたくないので、バッチで私に教えてください)、変更されたファイルの配列を返します。

問題は、配列が最初からあるため、毎回ファイルが変更されるだけで、元の配列に追加され続けます。

onValueがアレイを受け取るたびに、最後に変更されたファイルの配列が得られます。アレイを保持する変数はリセットする必要があります。

純粋なbacon.jsの方法はありますか?

答えて

0

これをうまくやるための超純粋な方法は考えられません。あなたは実際にscanにあなたのバッファーに突然変異を起こしていることに気付きましたか?これを利用して、onValueコードのバッファをクリアすることができます。 tinyLrSrvに送信するときにバッファをクローンすることを忘れないでください。私は同様の問題を自分で持っていたし、これを行うには素敵な「純粋」な方法を考え出したていない

var files = [] 
streamWatcher.skipDuplicates(_.isEqual).map('.path') 
    .doAction(a => files.push(a)) 
    .debounce(300) 
    .onValue(() => { 
    if (files.length) { 
     timyLrSrv.changed({body: {files}}) 
     files = [] 
    } 
    }) 

:もう一つの方法は、変数を使用することです。 Bacon.jsに対する問題を提出し、Bacon.jsのコアに追加する必要があるかどうかを判断することができます。

+0

私はこれを試しましたが、サブシーケンスデータは空に戻ります。私は 'scan'を使うことを意味しますが、私はdoActionを試していません。試してみましょう。 –

+0

doActionが機能します。スキャンでは(onValueの後の配列をリセットしなくても)、これはBacon.jsの面白い動作です –

+0

特定のアプローチ(スキャンに基づくものは何か?あなたはbacon.js githubコードベースに対してIssueを投稿することができます。実行可能なコードを含めてください。 – raimohanska

関連する問題