
Default
19.04.2018
15:49:07
За оффтоп

Dmitry
19.04.2018
15:50:02
гайс, как в реселекте замеморайзить только 1 аргумент ?

Artyom
19.04.2018
15:51:10
reselect(s => s, identity => identity)
=\

Dmitry
19.04.2018
15:51:23
но остальные аргумент ж пропадут

Google

Artyom
19.04.2018
15:52:42
mstp = state => ({
arg: state.arg,
memArg: selector(state),
})

Dmitry
19.04.2018
15:53:51
че ?
и что оно даст ?

Artyom
19.04.2018
15:55:22
Как ты думаешь?
А что надо?

Dmitry
19.04.2018
15:56:16
fn(a,b,c){}
надо меморйзить если поменялась а

Artyom
19.04.2018
15:56:24

Dmitry
19.04.2018
15:56:34
в остальных кейсах
не надо ниче делать

Artyom
19.04.2018
15:56:58

Dmitry
19.04.2018
15:57:21
selector(state)

Slava
19.04.2018
15:57:27

Google

Dmitry
19.04.2018
15:57:30
при чем мап стейт ту пропс
вообще

Slava
19.04.2018
15:57:54
и просто делать
function componentDidMount() {
this.props.dispatch(getMessages());
}

Valeriy
19.04.2018
15:58:10
сделай некий кастомный handshake протокол общения с бакендом

Slava
19.04.2018
15:58:43
Потому что на этапе маунта сокет еще не открыт и данные не получить

Valeriy
19.04.2018
15:59:03
открыл веб сокет, и пусть тебе бакенд шлет некий инициализирующий пакет пока ты его не получишь и не дашь отмашку что все гуд

Slava
19.04.2018
16:00:03

Valeriy
19.04.2018
16:00:09
в разных браузерах есть проблема с подпиской на логические каналы

Slava
19.04.2018
16:00:18
А

Valeriy
19.04.2018
16:00:23
в сокетах и в EventSource
часто бывает так, что ты в вебе думаешь что уже открыл вебсокет, а бакенд так не думает еще
и наоборот
я ловил и одну и другую ситуацию
событие типа onopen не канает

Artyom
19.04.2018
16:01:31

Slava
19.04.2018
16:01:44

Dmitry
19.04.2018
16:01:46

Slava
19.04.2018
16:01:52
Именно ответ от сервера?

Dmitry
19.04.2018
16:02:01
тип такого, но там надо меморайзер переписывать для реселекта

Google

Slava
19.04.2018
16:02:15
Типа прислать на клиент ready?

Valeriy
19.04.2018
16:03:04
А что тогда?
ну я в итоге свой handshake реализовал
бакенд открывает вебсокет и начинает слать в него пакеты каждые 500мс
как только фронт подписался на все логические каналы, принимает такой пакетик, так сразу дает бакенду отмашку типа все ок и я готов к приему данных
по крайней мере такая схема во всех браузерах у меня норм работает
а то в сафари свои особенности, в фф и хроме свои
про IE ваще молчу

Slava
19.04.2018
16:04:07

Valeriy
19.04.2018
16:04:07
и весь этот зоопарк надо поддерживать

Slava
19.04.2018
16:04:25
Допустим сервер скажет все ок
данные можно гнать
но

Valeriy
19.04.2018
16:04:53
все ок должен сказать не сервер, а браузер

Slava
19.04.2018
16:05:22
mount component -> dispatch(getMessages()) -> openConnection

Valeriy
19.04.2018
16:05:38
да не тащи ты это все в компоненты
делай это в сагах

Slava
19.04.2018
16:05:57
В сагах инициировать получение сообщений?

Valeriy
19.04.2018
16:06:04
ты в компоненте запаришься такие процессы обрабатывать
да все делать надо через саги
компоненты только за отображение информации должны отвечать и интерактив с юзером

Slava
19.04.2018
16:07:07
Хм, ну тогда сага будет знать что нужно получить сообщения, а если чата на страничке потом не будет?
Окей

Google

Valeriy
19.04.2018
16:07:26
тут надо понимать, что не страничка и не компонент отвечают за процессы приложения
а приложение рулит компонентами
логика у тебя должна крутиться параллельно вся
реакт компонентики подключенные к стейту должны с этими сагами посредством экшинов общаться

Slava
19.04.2018
16:08:31
Да, я согласен

Admin
ERROR: S client not available

Valeriy
19.04.2018
16:09:05
в итоге может получиться что то типа такого

Slava
19.04.2018
16:09:20
Просто с http инициация именно через componentDidMount идет?

Valeriy
19.04.2018
16:09:51
т.е. из сокета пришло сообщение в STREAM_INITIALIZE
ты отреагировал разок и далее если разрывы соединения будут, то takeEvery это поймает
если будет релогин юзера, то весь процесс будет cancel и потом снова fork

Slava
19.04.2018
16:10:36
Сейчас как-то так
export default function* wsHandling() {
while (true) {
yield takeLeading('START_WS');
try {
const socket = yield call(createWebSocketConnection);
const socketChannel = yield call(watchMessages, socket);
yield fork(function* saga() {
const { cancel } = yield race({
task: [
call(externalListener, socketChannel),
call(internalListener, socket),
],
cancel: take('STOP_WS'),
});
if (cancel) {
yield put(connectionClosed());
socketChannel.close();
}
});
yield put(connectionOpened());
} catch (e) {
console.error(e);
yield put(connectionError());
return;
}
}
}

Valeriy
19.04.2018
16:10:38
ну у тебя я тут не вижу yield cancel(...)
любой повторный круг событий у тебя форкнет задачи
задублирует их

Slava
19.04.2018
16:11:49
ну я имею ввиду smart компонент
takeLeading же отработает один раз?

Valeriy
19.04.2018
16:15:27

Google

Valeriy
19.04.2018
16:15:39
потом будет ожидать очередного события
я честно говоря такого паттерна использования не видел
т.е. вот такая запись мне кажется не правильной yield takeLeading('START_WS');

Slava
19.04.2018
16:17:26
Да я может что-то конечно напутал

Valeriy
19.04.2018
16:17:28
на самом деле это тоже самое что takeEvery, только takeEvery срабатывает всегда, а takeLeading сработает и пока не завершится не будет выполнять очередную задачу

Slava
19.04.2018
16:18:13
Тобишь для форка нужен кенсл?
Идеи брал тут
https://medium.com/@ebakhtarov/bidirectional-websockets-with-redux-saga-bfd5b677c7e7

Orkhan
19.04.2018
16:19:57
Кто работал с react-apollo ?

Valeriy
19.04.2018
16:20:11
если у тебя в конструкции try/catch посыпалось там че то, то cancel по моему автоматически будет сделан

Slava
19.04.2018
16:21:27

Storn
19.04.2018
16:22:10
Пагни и девушки лень самому верстать, подскажите бесплатные ui
Если это вас не сильно затруднит:)

Slava
19.04.2018
16:23:50

Storn
19.04.2018
16:24:42

Artyom
19.04.2018
16:34:27

Сергей
19.04.2018
16:35:40
Ребята. В состоянии хранится массив объектов this.state = {fields: [{id: 'name', name: 'field name', required: true}, ...]} необходимо изменить параметр 'name' через <input name="name" value={this.state.fields[index].name} onChange={ ... } />

Pauline
19.04.2018
16:36:58