【问题标题】:Bacon.js (FRP) - Add/remove values from array and save in storageBacon.js (FRP) - 从数组中添加/删除值并保存在存储中
【发布时间】:2016-08-10 22:11:07
【问题描述】:

我是 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 触发时,它不会添加到现有的数组中,item 会替换以前的数组值:['D']

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

【问题讨论】:

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


    【解决方案1】:

    使用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)
    )
    

    【讨论】:

    • 谢谢!我已经想通了,并以与您的示例完全相同的方式进行操作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2014-01-31
    相关资源
    最近更新 更多