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

Javascript Bacon.js(FRP)-从数组中添加/删除值并保存在存储器中,javascript,functional-programming,rxjs,frp,bacon.js,Javascript,Functional Programming,Rxjs,Frp,Bacon.js,我不熟悉Bacon.js和FRP概念。我正在努力实现非常基本的功能。我在一些本地存储器中保存了一组值: ['A', 'B', 'C'] 我有一个异步函数,可以从存储器中读取这些值(返回Promise) 我有'add'事件将新项目添加到数组,还有'remove'事件将项目从数组中删除。每次阵列更新都应将更新的阵列写入本地存储 我最终得到了这个解决方案,但它没有按预期工作: const items = Bacon .fromPromise(storage.get('items'))

我不熟悉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
    项一起激发时,它不会添加到现有数组中,该项会替换以前的数组值:
    ['D']

我怎么能用熏肉做呢?我正在考虑
update
方法,但不幸的是,它的初始值不应该是流或其他异步操作。

使用
Bacon.update
。您可以使用空数组作为初始值,并从存储器中提供异步初始值作为
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)
)

谢谢我已经找到了答案,并以与您的示例完全相同的方式进行了操作:)