
George
16.06.2017
14:59:40
ну да.. канеш, данные записываются в стейт
общего стора

andretshurotshka?❄️кде
16.06.2017
14:59:55
чет я не въезжаю

George
16.06.2017
14:59:59
резолвить можно наверху

Google

George
16.06.2017
15:00:03
во вьюхе даже

Кирилл
16.06.2017
15:00:12

George
16.06.2017
15:00:21
эм, ща

Mikhail
16.06.2017
15:01:06
Подскажите, а как так выходит, что из-за вебака я могу сослаться в window через перменную global?


George
16.06.2017
15:01:20
import {assign, every, filter, findIndex, some} from 'lodash';
import { State } from '../../../models/AppState';
import GameActions from '../actions';
import coordsInArray from '../../../utils/coordsInArray';
const initialState: State = {
"hits": [],
"misses": [],
"layout": [],
"shipTypes": {}
};
// Reducer
/**
* Another clever approach of writing reducers:
*
* export default function(state = initialState, action) {
* const actions = {
* [ACTION_TYPE]: () => [action.payload.data, ...state]
* };
*
* return (_.isFunction(actions[action.type])) ? actions[action.type]() : state
* }
*/
export default function reducer(state: State = initialState, action: any = {}): State {
switch (action.type) {
case GameActions.GET_LAYOUT:
return assign({}, state, action.payload);
break;
case GameActions.SHOOT_CELL: {
let { hits, misses, layout } = state;
const coords = [action.x, action.y];
const hasCollision = some(layout,
ship => {
const isHit = coordsInArray(ship.positions, coords);
if (isHit) {
// mutations of hits
console.warn('Hit', ship);
hits = state.hits.concat([coords]);
if (every(ship.positions, coord => coordsInArray(hits, coord)))
{
// sanked ship alert
console.warn('Sinked', ship);
}
}
return isHit;
}
);
if (!hasCollision) {
console.error('Missed');
misses = state.misses.concat([coords]);
}
return {
...state,
hits,
misses,
}
}
default:
return state;
}
}


Oleg ?
16.06.2017
15:01:37
А есть примеры использования JSS в продакшен коде?

George
16.06.2017
15:02:57
return assign({}, state, action.payload); ну тут изи.. сначала payload в экшене - это function, затем он превращается в данные при ответе с сервера

Eugeniy
16.06.2017
15:03:18
У вас там break после return стоит)

Pavel
16.06.2017
15:03:20
А как быть, если мне надо действия складывать в цепочки?
Например два действия застрелитьВасю и спрятатьТруп я всегда использую друг за другом.
Делать общее действие убитьВасю и внутри него делать два dispatch?

Eugeniy
16.06.2017
15:03:26
н - не нужен

George
16.06.2017
15:03:34


Кирилл
16.06.2017
15:03:39
import {assign, every, filter, findIndex, some} from 'lodash';
import { State } from '../../../models/AppState';
import GameActions from '../actions';
import coordsInArray from '../../../utils/coordsInArray';
const initialState: State = {
"hits": [],
"misses": [],
"layout": [],
"shipTypes": {}
};
// Reducer
/**
* Another clever approach of writing reducers:
*
* export default function(state = initialState, action) {
* const actions = {
* [ACTION_TYPE]: () => [action.payload.data, ...state]
* };
*
* return (_.isFunction(actions[action.type])) ? actions[action.type]() : state
* }
*/
export default function reducer(state: State = initialState, action: any = {}): State {
switch (action.type) {
case GameActions.GET_LAYOUT:
return assign({}, state, action.payload);
break;
case GameActions.SHOOT_CELL: {
let { hits, misses, layout } = state;
const coords = [action.x, action.y];
const hasCollision = some(layout,
ship => {
const isHit = coordsInArray(ship.positions, coords);
if (isHit) {
// mutations of hits
console.warn('Hit', ship);
hits = state.hits.concat([coords]);
if (every(ship.positions, coord => coordsInArray(hits, coord)))
{
// sanked ship alert
console.warn('Sinked', ship);
}
}
return isHit;
}
);
if (!hasCollision) {
console.error('Missed');
misses = state.misses.concat([coords]);
}
return {
...state,
hits,
misses,
}
}
default:
return state;
}
}
не пойму в экшне в пейлоаде промис, в редьюсере почему это данные то уже?


Pavel
16.06.2017
15:03:43

Google

Кирилл
16.06.2017
15:04:01
там миддл какой то резхолвит чтоль??

George
16.06.2017
15:04:06
да
redux-promise

Кирилл
16.06.2017
15:04:14
а ну так с этого надо начинать было

George
16.06.2017
15:04:37
насчет примера сценария гляну
не уверен что в этом проекте есть (
просто в основной с сагой и рефлаксом было

Pavel
16.06.2017
15:05:24

George
16.06.2017
15:05:38
не, сага это ооочень крутая вещь

Pavel
16.06.2017
15:05:59
ох
ещё одну либу ставить)

Кирилл
16.06.2017
15:06:08
хзхз в сагах бойлерплейта куча

Eugeniy
16.06.2017
15:06:31

Кирилл
16.06.2017
15:06:32
единственный плюс это пощупать генераторы

George
16.06.2017
15:07:18
нет, единственный плюс что вы можете оркестрировать сценарии по-правильному
а в генераторах нет ничо такого вау

Кирилл
16.06.2017
15:07:38
по-правильному?

George
16.06.2017
15:07:45
могу примерчик как раз на саге скинуть

Кирилл
16.06.2017
15:08:04
желательно поменьше чем предыдущий

George
16.06.2017
15:08:22
да конечно

Google

George
16.06.2017
15:08:24
ток кусочек
чтоб понимать

Кирилл
16.06.2017
15:08:39
в нетерпении


George
16.06.2017
15:09:01
function * saveCashReceipt ({ payload }) {
try {
const resp = yield call(AppService.getConfirmationMethod, payload);
yield put({ type: `${AppActions.GET_CONFIRMATION_METHOD}_OK`, confirmationMethod: resp });
if (resp === 'URM') {
console.log('URM detected');
yield put({ type: `${AppActions.SHOW_CONFIRMATION}` });
const { urm, cashier } = yield race({
urm: take(AppActions.CONFIRM_URM),
cashier: take(AppActions.CONFIRM_CASHIER)
});
yield put({ type: `${AppActions.HIDE_CONFIRMATION}` });
let mode;
if (urm) {
mode = 'URM';
} else if (cashier) {
mode = 'CASHBOX';
}
try {
const resp = yield call(AppService.saveCashReceipt, mode, payload);
yield put({ type: `${AppActions.SAVE_CASH_RECEIPT}_OK`, cashReceipt: resp });
} catch (err) {
yield put({ type: `${AppActions.SAVE_CASH_RECEIPT}_ERR`, err });
}
} else {
console.log('Other detected');
}
} catch (err) {
yield put({ type: `${AppActions.GET_CONFIRMATION_METHOD}_ERR`, err });
}
}
вот тут происходит сразу появление модалки, и обработка действий с нее, и 2 запроса ajax
все это помещается в несколько строк кода... и выглядит очень прозрачно


Кирилл
16.06.2017
15:10:30
очень прозрачно... особенно если не знать что такое call put race
да и в чем тут преимущество конкретно саг?
зачем тут интерполяция?) ${AppActions.HIDE_CONFIRMATION}

George
16.06.2017
15:11:24
то что она следит за приложением, своего сервис запущенный ... своего рода редьюсер для действий

andretshurotshka?❄️кде
16.06.2017
15:11:54
зачем нужна сага если есть async/await и redux-thunk

Сергей
16.06.2017
15:12:16

Кирилл
16.06.2017
15:12:39

George
16.06.2017
15:12:40
в том и дело, что тут комбайн из действий происходит, а там куча всего лишнего. Плюс она бонусом дает решать несколько задач типа с потоками событий
ну вы почитайте, тут очень долго объяснять

Кирилл
16.06.2017
15:13:19

George
16.06.2017
15:13:39
есть задачи где надо мониторить не одно действие, а потоки действий
и делать какие-либо с ними операции...

Кирилл
16.06.2017
15:13:57

Dreamerinnoise
16.06.2017
15:14:19

Google

George
16.06.2017
15:14:27
например закликивание чего-либо.. либо отлов первого загруженного сценария

Кирилл
16.06.2017
15:15:10

Дмитрий
16.06.2017
15:15:12

George
16.06.2017
15:15:30
оч, особенно когда оно делается в форке

Дмитрий
16.06.2017
15:15:45
То есть, достаточно ОДНОГО экшна и одного thunk с двумя асинхронными действиями подряд

Кирилл
16.06.2017
15:16:02

Дмитрий
16.06.2017
15:16:26
А то начинают городить из простого вызова функции какой-то цирк с экшнами и, я извиняюсь, "сагами"

George
16.06.2017
15:16:30
ну блин, я не предлагаю мне верить ) я предлагаю поюзать, потом сказать что это сложно )
ты выносишь логику как раз из экшен криэторов

Admin
ERROR: S client not available

Кирилл
16.06.2017
15:16:50

George
16.06.2017
15:17:10
и твои экшен криэторы становятся настоящими экшен криэторами, которые нужны только для того чтобы через функцию вызывать экшен

Сергей
16.06.2017
15:17:21
прикольный тред))

andretshurotshka?❄️кде
16.06.2017
15:17:24

Дмитрий
16.06.2017
15:17:26

George
16.06.2017
15:17:27
а сага - это сценарий манипуляции с данными - все в одном месте )

Dreamerinnoise
16.06.2017
15:17:29
лучше Mobx взять?
чем эти саги

Сергей
16.06.2017
15:17:39

Google

George
16.06.2017
15:17:43

andretshurotshka?❄️кде
16.06.2017
15:17:46
лучше cyclejs

Дмитрий
16.06.2017
15:17:52
purescript

andretshurotshka?❄️кде
16.06.2017
15:18:00

Сергей
16.06.2017
15:18:01
Delphi!

George
16.06.2017
15:18:06

Pavel
16.06.2017
15:18:17

Дмитрий
16.06.2017
15:18:21

Dreamerinnoise
16.06.2017
15:18:30

Дмитрий
16.06.2017
15:18:31
но для того, чтобы это сделать сага ваще не нужна

George
16.06.2017
15:18:37
ессесн
чо там только observable
и больше знать ни хуя не надо )

Кирилл
16.06.2017
15:19:09
ой не тому ответил

Дмитрий
16.06.2017
15:19:28
Лол
Смешно)

andretshurotshka?❄️кде
16.06.2017
15:19:51
[ACTION]: funcName,
[ACTION2]: funcName

Дмитрий
16.06.2017
15:20:17

Сергей
16.06.2017
15:20:31

Дмитрий
16.06.2017
15:20:40
sort of