И? Какая разница, если всю основную работу делает reducer?
Тогда получается так.
В Perform выполняем асинхронный код. Если да — диспетчим Success, если нет — диспетчим Failed
reducer реагирует на Perform, сразу возвращает обновленный стейт, на Failed - возвращает как было, на Success — ничего не делает?