Bacon.js(FRP) - 从数组中添加/删除值并保存在存储中

时间:2016-08-10 22:11:08

标签: javascript functional-programming rxjs frp bacon.js

我是Bacon.js和FRP概念的新手。我正在努力实现非常基本的功能。我在一些本地存储中有一系列已保存的值:

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

我有一个异步函数,它从存储中读取这些值(返回Promise)。

我有'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']
  • 但是当使用'add'项触发D事件时,它不会添加到现有数组,item会替换以前的数组值:['D']

我怎么能用培根做到这一点?我在考虑使用update方法,但不幸的是,它的初始值应该不是流或其他异步操作。

1 个答案:

答案 0 :(得分:2)

使用Bacon.update。您可以使用空数组作为初始值,并将存储中的async初始值作为Bacon.update的输入流之一。所以,试试像

这样的东西
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)
)