2016-08-10 8 views
1

Я новичок в концепциях Bacon.js и FRP. Я борюсь с реализацией очень простых функций. У меня есть массив сохраненных значений в некотором локальном хранилище: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, но, к сожалению, его первоначальное значение должно быть не потоком или каким-либо другим асинхронным действием.

ответ

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) 
) 
+0

спасибо! Я уже понял это и сделал точно так же, как в вашем примере :) – Kosmetika

 Смежные вопросы

  • Нет связанных вопросов^_^