2016-04-20 3 views
0

Я ищу немного ссылки на redux; из-за поддержки нескольких разных платформ (Java Android, ios swift, ios Obj-c, go, Node.js и веб-javascript) Я издевался над решением для управления приложениями в реальном времени.Редукционный поток для динамического реального времени api?

Объяснение того, как эта работа достаточно обширна, но в основном это конечная точка отдыха, данные которой могут быть проанализированы, и она специально разработана для создания простого менеджера api в реальном времени и сборщика ресурсов, который работает одинаково на платформах (это JS пример); например.

API.fromURL('https://api.mysite.com/v1').then(loadApi).catch(...); 

function loadAPI(api){ 
    if (!api.user){ 
    api.login('user','password').then(()=>{ 
     workWithAPI(api); 
    }).catch(...); 
    } else { 
     workWithAPI(api); 
    } 
} 

function workWithAPI(api){ 
    console.log(api.user); 
    api.user.on('update',(event)=>{ 
    console.log(event.name === api.user.name); //true 
    //changes happen even if you don't have a listener 
    }); 

    if (!api.user.isSubscribed()){ 
     api.user.subscribe().then(()=>{ 
     api.user.setName(...).then...; 
     save(api.serialize()); 
     }).catch(...); 
    } else { 
     api.user.setName(...).then...; 
     save(api.serialize()); 
    } 
} 

API.fromData(...).then(loadApi).catch(...); 

Самое замечательное в том, что этот апи объект представляет состояние объектов, которые он содержит, так что если у вас есть объект пользователя, он всегда будет держать на синхронизацию с базой данных и отражать изменения с помощью событий, которые отправляются из сервер.

Вопрос в том, как применить эту идею к Redux концепции в контексте браузера эффективным способом ...

Учитывая:

  1. что все объекты, содержащиеся в объекте апи существует в магазине; но могут быть состояния приложения, которые связаны с ui, которых нет в состоянии объекта api.

  2. Что объект api и все, что он содержит, являются изменяемыми, а redux лучше работает на неизменности.

  3. То, что объект api сериализуется, подобно магазину.

  4. То, что объект api является деревом, и это не очень хорошая практика для использования в модели redux.

ответ

1

Вам необходимо синхронизировать свое состояние API в своем состоянии Store. Для этого наилучшим способом, на мой взгляд, является переписать или интегрировать ваш объект API внутри Redux, как создателя внешнего действия.

Так вот как я бы это сделать (учитывая, что вы не упоминаете React):

Я бы поддерживать поддерево для метаданных о связи:

{ connecting: false, authenticated: true, status: 'CONNECTED' } 

Таким образом, вы можете справиться если ваше соединение не работает или что-то еще. Дайте ему также некоторые действия, чтобы мутировать это состояние.

const actions = { reconnectToAPI, logIn, logOut, connectionLost } 

(те пункты действия создателей, я использовал синтаксис ES6 для объекта, { reconnectToAPI } такое же, как { reconnectToAPI: reconnectToAPI })

Теперь связать эти метаданные для ваших событий.

connection.on('lost', reason => { 
    dispatch(connectionLost(reason)) 
    dispatch(reconnectToAPI()) 
}) 

Войти будет thunk, который будет проверять подлинность вас, используя имя пользователя и пароль, с помощью вашего API.

const logIn = (username, password) => dispatch => { 
    return api.authenticate(username, password) 
    .then(profile => { 
    dispatch(loggedIn(profile)) 
    }, error => { 
    dispatch(failedToLogIn(error)) 
    }) 
} 

Дальше вы сопоставляете свое состояние с деревом других. Я бы предложил сделать усилитель или промежуточное программное обеспечение для этого. Дайте ему также некоторые действия или автоматически сгенерируйте их, если вам это нужно.

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