рд░реЗрдбрдХреНрд╕-рд╕рд╛рдЧрд╛ рдЪреИрдирд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ

рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрдпрд╛рд░реЗ рджреЛрд╕реНрддреЛрдВред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ Redux-saga рдЪреИрдирд▓ рдХреЗ рддрдВрддреНрд░ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рдХрд░реАрдм рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред


рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рд╡реЙрдЪ-рдПрдВрдб-рдлреЛрд░реНрдХ рдореЙрдбрд▓ рд╕рдорд╕реНрдпрд╛


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдлрд╝реЙрд░реНрдо рдХрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡реЙрдЪ-рдПрдВрдб-рдлреЛрд░реНрдХ рдореЙрдбрд▓ рд╣реИ:


import { take, fork } from 'redux-saga/effects' function* watchRequest() { while (true) { const {payload} = yield take('INIT_REQUEST'); // ,     yield fork(makeRequest, payload); } } function* makeRequest(payload) { //   } 

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдХрдИ 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); //      yield call(makeRequest, payload); } } function* makeRequest(payload) { //   } 

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 => { //     web socket const handshakeTimeoutId = setTimeout(() => { emitter('handshake - ok'); }, 100); const messageTimeoutId = setTimeout(() => { emitter('message'); }, 500); const endTimeoutId = setTimeout(() => { emitter(END); }, 1000); //     return () => { clearTimeout(handshakeTimeoutId); clearTimeout(messageTimeoutId); clearTimeout(endTimeoutId); } } ) } export function* saga() { const chan = yield call(initSocketChannel, query) try { while (true) { const message = yield take(chan); //    END   brake console.log(`socket : ${message}`) } } finally { console.log('socket terminated') } } 

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдиреЗ 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) рддрдп рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ рдмрдлрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рд╕рдВрджреЗрд╢ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдмрдВрдж рдХрд░рдиреЗ рдХреА


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдЪреИрдирд▓ рддрдВрддреНрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрд┐рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рджреБрдирд┐рдпрд╛ рдереЛрдбрд╝реА рдЖрд╕рд╛рди рд╣реЛ рдЧрдИ рд╣реИред

Source: https://habr.com/ru/post/hi432070/


All Articles