2016-08-10 7 views
1

Bacon.jsとFRPの概念が新しくなりました。私は非常に基本的な機能を実装するのに苦労しています。Bacon.js(FRP) - アレイから値を追加/削除してストレージに保存します

['A', 'B', 'C'] 

私はストレージからこれらの値を読み取る(プロミスを返す)非同期関数を持っています。

アレイに新しいアイテムを追加する場合は'add'イベント、アレイにアイテムを追加する場合は'remove'イベントがあります。すべてのアレイアップデートは、更新されたアレイをローカルストレージに書き込む必要があります。私はこの解決策になってしまったが、期待どおりに動作しません

const items = Bacon 
    .fromPromise(storage.get('items')) 
    .mapError(() => []) 
    .merge(Bacon.fromEvent(events, 'add').map(l => [l])) 
    .merge(Bacon.fromEvent(events, 'remove').map(l => [l])) 
    .skipDuplicates() 
    .filter(l => l) 
    .toProperty(); 

items.onValue((items) => { 
    // everytime rewrites storage with new array (but without old values) 
    console.log(items); 
    storage.put('items', items); 
}); 

return items; 

だから、スタート動作時には、次のとおりです。

  • 我々はストレージからデータを読み取る(それは大丈夫です):['A', 'B', 'C']
  • Dアイテムで'add'イベントが発生した場合、それは既存の配列に追加されません。前の配列値に置き換えられます:['D']

どのように私はベーコンでそれを行うことができますか?私はupdateメソッドを考えていましたが、残念ながらその初期値はストリームや他の非同期アクションではありません。

答えて

2

Bacon.updateを使用してください。空の配列を初期値として使用し、Bacon.updateの入力ストリームの1つとしてストレージから非同期初期値を提供することができます。したがって、何かを試してみてください

const items = Bacon.update([], 
    Bacon.fromPromise(storage.get('items')), (_, items) => items, 
    Bacon.fromEvent(events, 'add'), (items, newItem) => items.concat(newItem), 
    Bacon.fromEvent(events, 'remove'), (items, removedItem) => 
    items.filter((item) => item != removedItem) 
) 
+0

ありがとう!私はすでにそれを考え出し、あなたの例と同じようにしました:) – Kosmetika

関連する問題