рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрдпрд╛рд░реЗ рджреЛрд╕реНрддреЛрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ Redux-saga рдЪреИрдирд▓ рдХреЗ рддрдВрддреНрд░ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рдХрд░реАрдм рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╡реЙрдЪ-рдПрдВрдб-рдлреЛрд░реНрдХ рдореЙрдбрд▓ рд╕рдорд╕реНрдпрд╛
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдлрд╝реЙрд░реНрдо рдХрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡реЙрдЪ-рдПрдВрдб-рдлреЛрд░реНрдХ рдореЙрдбрд▓ рд╣реИ:
import { take, fork } from 'redux-saga/effects' function* watchRequest() { while (true) { const {payload} = yield take('INIT_REQUEST');
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдХрдИ INIT_REQUEST
рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрд░рдорд╢рдГ рдХрдИ makeRequest
рдЬрд╛рдПрдВрдЧреЗред рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ "рджреМрдбрд╝" рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдЪреИрдирд▓ рддрдВрддреНрд░ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред
рдЪреИрдирд▓ рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, INIT_REQUEST
) рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, makeRequest
рдХреЛ рдХрдИ рдмрд╛рд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд makeRequest
рдЬрд╛рдПрдЧрд╛)ред
рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓ рдПрдХ FIFO рдХрддрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЗрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░реЗрдВ:
channel
- рдШрдЯрдирд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ put
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;actionChannel
- рдШрдЯрдирд╛рдУрдВ рдХреЛ actionChannel
рд╕реНрдЯреЛрд░ рдХреЗ рдкрд╛рд╕ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ;eventChannel
- рдПрдХ рдмрд╛рд╣рд░реА рдШрдЯрдирд╛ рд╕реНрд░реЛрдд, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ;
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдЪреИрдирд▓ рдкрд░ рдЕрдзрд┐рдХ
рдРрд╕реЗ рдЪреИрдирд▓ рдЖрдорддреМрд░ рдкрд░ рд╕рд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред рдмрд╣реБрдд рдХрдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
channel([buffer])
рдЗрд╕рдХрд╛ рдПрдХ рдПрдХрд▓ buffer
рддрд░реНрдХ рд╣реИ - рд╕рдВрдЪрд┐рдд рдмрдлрд░ (рд╣рдо рдиреАрдЪреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ)ред
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдЕрдзрд┐рдХ
рдпрд╣ рдЕрдХреНрд╕рд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред
actionChannel(pattern, [buffer])
рдЗрд╕рдореЗрдВ рджреЛ рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:
pattern
- рд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдкреИрдЯрд░реНрди, рд╕рд╛рде рд╣реА рд╕рд╛рде take
;buffer
- рд╕рдВрдЪрдп рдмрдлрд░;
рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг:
import { take, actionChannel, call } from 'redux-saga/effects' function* watchRequest() { const requestChannel = yield actionChannel('INIT_REQUEST') while (true) { const {payload} = yield take(requestChannel);
EventChannel рдкрд░ рдЕрдзрд┐рдХ
рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред
eventChannel(subscribe, [buffer], [matcher])
рдЗрд╕рдореЗрдВ рддреАрди рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:
subscribe
рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдмрд╛рд╣рд░реА рдИрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдиреАрдЪреЗ, рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ) рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рддрд░реНрдХреЛрдВ рдореЗрдВ, рдХреЙрд▓рдмреИрдХ рдХреЛ рдПрдорд┐рдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рдЪреИрдирд▓ рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рдкрд╕реА рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП;buffer
- рд╕рдВрдЪрдп рдмрдлрд░;matcher
- рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдиред
рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг:
import { eventChannel, END } from 'redux-saga' import { take, put, call } from 'redux-saga/effects' function initSocketChannel(query) { return eventChannel(emitter => {
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдиреЗ END
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрд╛ - рдпрд╣ рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЕрдВрддред
рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, redux-saga рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
var CHANNEL_END_TYPE = '@@redux-saga/CHANNEL_END'; var END = { type: CHANNEL_END_TYPE }; var isEnd = function isEnd(a) { return a && a.type === CHANNEL_END_TYPE; };
рдФрд░ eventChannel
рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ eventChannel
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрдЦрддреЗ рд╣реИрдВ
function eventChannel(subscribe) { тАж if (isEnd(input)) { close(); return; } ... }
рдмрдлрд░ рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдореЗрдВ рдПрдХ рдЖрдзрд╛рд░ рдмрдлрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХрддрд╛рд░ рдмрдирддреА рд╣реИред
рдПрдХ рдмрдлрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
import { buffers } from 'redux-saga' const buffer = buffers.sliding(5);
buffers
рд╡рд┐рднрд┐рдиреНрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдлрд╝рд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
рдХреЗрд╡рд▓ 5 рд░рдгрдиреАрддрд┐рдпрд╛рдБ, рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрдирдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:
buffers.none()
- рдХреЛрдИ рдмрдлрд╝рд░рд┐рдВрдЧ рдирд╣реАрдВ, рдирдП рд╕рдВрджреЗрд╢ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ рдпрджрд┐ рдХреЛрдИ рдкреНрд░рддрд┐рднрд╛рдЧреА рд▓рдВрдмрд┐рдд рдирд╣реАрдВ рд╣реИрдВ;buffers.fixed(limit)
- рдирдП рд╕рдВрджреЗрд╢ рд╕реАрдорд╛ рддрдХ рдмрдлрд╝рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛ 10 рд╣реИ;buffers.expanding(initialSize)
- рдирд┐рд╢реНрдЪрд┐рдд рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдмрдлрд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛;buffers.dropping(limit)
рддрдп рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЪреБрдкрдЪрд╛рдк рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛;buffers.sliding(limit)
рддрдп рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ рдмрдлрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рд╕рдВрджреЗрд╢ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдмрдВрдж рдХрд░рдиреЗ рдХреА
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдЪреИрдирд▓ рддрдВрддреНрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрд┐рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рджреБрдирд┐рдпрд╛ рдереЛрдбрд╝реА рдЖрд╕рд╛рди рд╣реЛ рдЧрдИ рд╣реИред