Redux поток для динамического API в реальном времени?
Я ищу немного ссылок относительно редукса; из-за поддержки нескольких различных платформ (Java Android, ios swift, ios Obj-c, go, Node.js и веб-javascript) я разработал решение для управления приложениями в реальном времени.
Объяснение того, как эта работа довольно обширна, но в основном это конечная точка отдыха, данные которой можно анализировать, специально разработано для создания простого менеджера 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(...);
Самое замечательное то, что этот объект API представляет состояние объектов, которые он содержит, поэтому, если у вас есть пользовательский объект, он всегда будет синхронизироваться с базой данных и отражать изменения через события, отправленные с сервера.
Вопрос в том, как эффективно применить эту идею к концепции избыточности в контексте браузера?...
Принимая во внимание:
Что все объекты, содержащиеся в объекте API, существуют в хранилище; но могут быть состояния приложения, связанные с пользовательским интерфейсом, которые не существуют в состоянии объекта API.
То, что объект api и все, что в нем содержится, является изменчивым, а redux лучше работает с неизменяемостью.
То, что объект api сериализуем так же, как магазин.
То, что объект api - это дерево, и не рекомендуется использовать его в модели с избыточностью.
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())
})
logIn был бы паролем, который аутентифицировал бы вас, используя имя пользователя и пароль через ваш API.
const logIn = (username, password) => dispatch => {
return api.authenticate(username, password)
.then(profile => {
dispatch(loggedIn(profile))
}, error => {
dispatch(failedToLogIn(error))
})
}
Затем вы сопоставляете свое состояние с другим деревом. Я бы посоветовал сделать для этого магазин энхансера или промежуточного программного обеспечения. Дайте ему также некоторые действия или автоматически сгенерируйте их, если вам это нужно.