2017-10-30 7 views
0

Hier ist der Code Beispiel:Baconjs Rückkehr nur letzten debounce Wertes

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 
       } 
      }); 
     } 
    }); 

Was ich versuche zu tun, verwendet chokidar einen Ordner ändern zu sehen (ein Web-Verzeichnis in der Entwicklung) dann Bacon.js mit einzuwickeln und debounce (weil ich nicht jede Dateiänderung wissen möchte, sagen Sie mir einfach in einem Stapel) und geben Sie das Array der geänderten Dateien zurück.

Das Problem ist - das Array ist von Anfang an, so dass jedes Mal, wenn Datei ändern, es nur zum ursprünglichen Array hinzufügen.

Was ich erhalten möchte, ist das zuletzt geänderte Array von Dateien, in einem anderen Wort, jedes Mal, wenn das onValue das Array empfängt, muss die Variable, die das Array enthält, zurückgesetzt werden.

Gibt es einen pure speck.js Weg, dies zu tun?

Antwort

0

Ich kann nicht denken, eine super "reine" Art, dies gut zu tun. Haben Sie bemerkt, dass Sie Ihren Puffer tatsächlich in mutieren? Sie können dies ausnutzen und den Puffer in Ihrem Code löschen. Denken Sie daran, den Puffer beim Senden an tinyLrSrv zu klonen. Ein andere Möglichkeit wäre, eine Variable zu verwenden:

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

ich ein ähnliches Problem habe mich gehabt und habe keinen schönen „reinen“ Weg, dies zu tun, herausgefunden. Bitte reichen Sie ein Problem gegen Bacon.js ein und wir können herausfinden, ob wir etwas zu Bacon.js core hinzufügen sollten.

+0

Ich habe dies versucht, aber die Subsequenz Daten leer zurückgeben. Ich meine den Scan, aber ich habe die DoAction nicht ausprobiert. Werde es versuchen. –

+0

Die doAction funktioniert. Der Scan nicht (sogar das Array nach dem onValue zurückgesetzt), das ist ein interessantes Verhalten von Bacon.js –

+0

Wenn Sie diskutieren wollen, warum ein bestimmter Ansatz (etwas basierend auf Scan?) Nicht funktioniert, auch wenn Sie es denken sollten Sie ein Problem gegen die speck.js github Codebase posten und wir werden es uns ansehen. Bitte fügen Sie ausführbaren Code ein. – raimohanska