Повторно реализовать избыточность, наблюдаемую только с RxJs?

Я пытаюсь увидеть (из любопытства), насколько сложно было бы повторно реализовать базовое поведение с редукцией / наблюдаемым с редукцией с помощью чистых Rxjs.

Вот мой взгляд на это, но он кажется невероятно простым, чтобы быть правильным. Может ли кто-нибудь указать мне на какие-либо ошибки/недостатки в моей логике?

Большое тебе спасибо

// set up the store.dispatch functionnaly through a subject (action$.next() is like store.dispatch())
var action$ = new Rx.Subject()


// Create epics that do nothing interesting
function epic1(action$) {
  return action$.filter(action => action.type == "test").delay(1000).mapTo({
    type: "PONG"
  })
}

function epic2(action$) {
  return action$.filter(action => action.type == "test2").delay(2000).mapTo({
    type: "PING"
  })
}


//....
//Later on, Merge all epic into one observable
//
function activateAndMergeEpics(action$, ...epics) {
  // give the action$ stream to each epic
  var activatedArray = epics.map(epic => epic(action$))
  // merge them all into one megaObservable
  var merged = Rx.Observable.merge(...activatedArray)
  return merged
}


var merged = activateAndMergeEpics(action$, epic1, epic2)

// Pipe your megaObservable back inside the loop so 
// you can process the action in your reducers
var subscription = merged.subscribe(action$)

function rootReducer(state = {}, action) {
  console.log(action)
  return (state)
}

// Generate your state from your actions
var state$ = action$.scan(rootReducer, {})

// Do whatever your want now, like...
// state$.map(route).map(renderdom)

// Let's juste subscribe to nothing to get the stream pumping
state$.subscribe()



// Simulate a dispatch
action$.next({
  type: "test"
})

// Another one
action$.next({type:"test2"})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>


person TheoH    schedule 05.10.2017    source источник


Ответы (1)


Да, у вас полностью есть основные функции.

Надеюсь, вы не возражаете против непрошенного совета: если вы делаете это только для того, чтобы узнать, как это работает, я вам аплодирую! Это такая замечательная и удивительно редкая черта даже среди программистов. Я хочу предостеречь от использования вашего собственного домашнего клона редукса, потому что тогда вы потеряете много огромных преимуществ редукса; devtools, промежуточное ПО, энхансеры. Вы теряете все его встроенные утверждения/проверки ошибок, которые на самом деле составляют большую часть кода в редуксе (некоторые из которых удалены в производственных сборках). Вы также теряете исправления для пограничных случаев, которые вытряхиваются с годами, поэтому иногда данная библиотека может показаться излишне сложной кому-либо без этого контекста.

Вы можете добавить все эти вещи, но тогда это будет просто перебор ????

Если вы решите пойти по этому пути, ознакомьтесь с некоторыми из существующих клонов на основе RxJS для вдохновения (или совместной работы):

person jayphelps    schedule 05.10.2017
comment
Вау, ответ от самого создателя, круто! Что ж, спасибо за совет и ответ! Я уже читал, почему вы сделали это с Redux, а не с нуля? из статьи Бена Леша здесь: статья Бена Леша - person TheoH; 06.10.2017