рд░рд┐рдПрдХреНрдЯрд┐рд╡рдПрдХреНрд╕ рд░рд┐рдбрдХреНрд╕

рд╣рд░ рдХреЛрдИ рдЬреЛ Redux рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЬрд▓реНрдж рд╣реА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЖрдзреБрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдмреИрдХрдПрдВрдб, рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЯрд╛рдЗрдорд░ / рджреЗрд░реА рдХреЗ рд▓рд┐рдП http-request рд╣реИрдВред Redux рдирд┐рд░реНрдорд╛рддрд╛ рдЦреБрдж рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЛрд▓рддреЗ рд╣реИрдВ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛-рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмреЗрд╢рдХ, рдпрд╣ рдмрд╣реБрдд рд╣реА рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдРрд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдвреВрдВрдврдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ "рджреЗрд╢реА" рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреИрд╕реЗ рдХрд┐ рдердВрдХ, рд╕рд╛рдЧрд╛ рдФрд░ рдЬреИрд╕реЗ рд╣рдореЗрд╢рд╛ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдпрд╛ рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

async dispatch => { setTimeout(() => { try { await Promise .all([fetchOne, fetchTwo]) .then(([respOne, respTwo]) => { dispatch({ type: 'SUCCESS', respOne, respTwo }); }); } catch (error) { dispatch({ type: 'FAILED', error }); } }, 2000); } 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛ рднреА рджрд░реНрджрдирд╛рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЬрдм рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ? рдпрджрд┐ рдЖрдкрдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?

рдореЗрд░рд╛ рдирд╛рдо рджрд┐рдорд┐рддреНрд░реА рд╕рдореЛрдЦрд╛рд╡рд▓реЛрд╡ рд╣реИ, рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Redux рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ Redux-Saga рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрди рд╕рднреА рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред

рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, redux-saga рд▓реЗрдВред рдареАрдХ рд╣реИ, рд╣рдо рд╕рд╛рдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 try { yield call(delay, 2000); const [respOne, respTwo] = yield [ call(fetchOne), call(fetchTwo) ]; yield put({ type: 'SUCCESS', respOne, respTwo }); } catch (error) { yield put({ type: 'FAILED', error }); } 

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ - рдХреЛрдб рд▓рдЧрднрдЧ рд░реИрдЦрд┐рдХ рд╣реИ, рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдкрдврд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧрд╛рдерд╛ рдХреЗрд╡рд▓ рдерди рдХреЗ рд╕рдорд╛рди рд╣реА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред

рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЖрд░рдПрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡реЗ рдСрдмреНрдЬрд░реНрд╡рдмрд▓реНрд╕, рд░рд┐рдПрдХреНрдЯрд┐рд╡ рд╕реНрдЯреНрд░реАрдо рдЖрджрд┐ рднреА рд╣реИрдВ)ред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 action$ .delay(2000) .switchMap(() => Observable.merge(fetchOne, fetchTwo) .map(([respOne, respTwo]) => ({ type: 'SUCCESS', respOne, respTwo })) .catch(error => ({ type: 'FAILED', error })) 

рдХреЛрдб рди рдХреЗрд╡рд▓ рдлреНрд▓реИрдЯ рд╣реЛ рдЧрдпрд╛ рдФрд░ рд╡реЙрд▓реНрдпреВрдо рдореЗрдВ рдХрдореА рдЖрдИ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╣рдо рд╕реАрдзреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдирд╛рдордХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред

рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ (рдЕрдиреБрдХреНрд░рдо) рджреЗрддрд╛ рд╣реИред рдЕрд╡рд▓реЛрдХрдиреАрдп рдХреЗ рддреАрди рдореБрдЦреНрдп рд░рд╛рдЬреНрдп рд╣реИрдВ - рдЕрдЧрд▓рд╛ ("рдЕрдЧрд▓рд╛ рдорд╛рди рджреЗрдВ"), рддреНрд░реБрдЯрд┐ ("рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ") рдФрд░ рдкреВрд░реНрдг ("рдорд╛рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП, рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ")ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рдкреНрд░реЛрдорд┐рд╕ рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдВрддрд░ рд╣реИ рдХрд┐ рдЗрди рдореВрд▓реНрдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдФрд░ рдпрд╣ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╕реБрдкрд░рдкреЙрд╡рд░ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ)ред рдЖрдк рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдореЗрдВ рдХреБрдЫ рднреА рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ - рдЯрд╛рдЗрдордЖрдЙрдЯ, http рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ, DOM рдЗрд╡реЗрдВрдЯ, рд╕рд┐рд░реНрдл js рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ред



рджреВрд╕рд░реА рдорд╣рд╛рд╢рдХреНрддрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВред рдПрдХ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреА рдзрд╛рд░рд╛ рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИред рдирд┐рдХрдЯрддрдо рд╕рд╛рджреГрд╢реНрдпрддрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдирдХреНрд╢рд╛ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ (рд╡реИрд╕реЗ, рдРрд╕реЗ рдСрдкрд░реЗрдЯрд░ рдЖрд░рдПрдХреНрд╕ рдореЗрдВ рд╣реИрдВ)ред



рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЬрд╝рд┐рдк, рдлреЛрд░реНрдХрдЬреЙрдЗрди рдФрд░ рдлреНрд▓реИрдЯрдкреЙрдкрд░ рдСрдкрд░реЗрдЯрд░ рдереЗред рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдХрд╛рдо рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред

рдЬрд┐рдк рдСрдкрд░реЗрдЯрд░ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдХреБрдЫ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ (9 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ) рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВред

 const first = fromEvent("mousedown"); const second = fromEvent("mouseup"); zip(first, second) .subscribe(e => console.log(`${e[0].x} ${e[1].x}`)); //output [119,120] [120,233] тАж 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрд┐рдк рдХреЗ рдХрд╛рдо рдХреЛ рдпреЛрдЬрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдЬрд┐рдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдЕрд╡рд▓реЛрдХрдиреАрдп рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрддрд░рд╛рд▓ рдкрд░, рд╕рдордХрд╛рд▓рд┐рдХ рдпрд╛ рдирд╣реАрдВ) рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред DOM рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред

ForkJoin рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬрд╝рд┐рдк рдХреЗ рд╕рдорд╛рди рд╣реИ - рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЗ рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред



рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рдзрд╛рд░рд╛ рд╕реЗ рдХреЗрд╡рд▓ рдкрд░рд┐рдорд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИ рдлреНрд▓реИрдЯрдкреЛрдЯ рдСрдкрд░реЗрдЯрд░ред рдпрд╣ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдЪрдпрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░реЗрдЦ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:



рдХреЛрдб рдореЗрдВ рднреА рд╕реНрдкрд╖реНрдЯ:

 const observable = of("Hello"); const promise = value => new Promise(resolve => resolve(`${value} World`); observable .flatMap(value => promise(value)) .subscribe(result => console.log(result)); //output "Hello World" 

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдлреНрд▓реИрдЯрдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреИрдХрдПрдВрдб рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕реНрд╡рд┐рдЪрдкрд╛рдЗрдк рдФрд░ рдХреЙрдирдХрдЯреИрдмред
рдореИрдВ Redux рдореЗрдВ Rx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рд░реЗрдбрдХреНрд╕-рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЗрд╕рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:



рд╕рднреА рд╡реЗрдзрд╢рд╛рд▓рд╛ рд╕рдВрдЪрд╛рд▓рдХ рдФрд░ рдЙрди рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╡рд┐рд╢реЗрд╖ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдорд╣рд╛рдХрд╛рд╡реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдФрд░ рдПрдХреНрд╢рди рдХреЛ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдпрд╣ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдмрдирд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдорд╣рд╛рдХрд╛рд╡реНрдп рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЖрдкреА рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

 const fetchEpic = action$ => action$ .ofType('FETCH_INFO') .map(() => ({ type: 'FETCH_START' })) .flatMap(() => Observable .from(apiRequest) .map(data => ({ type: 'FETCH_SUCCESS', data })) .catch(error => ({ type: 'FETCH_ERROR', error })) ) 

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

рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗред

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдорд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдпрд╣ рд╕рд╛рдЧрд╛ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 while(true) { const timer = yield race({ stopped: take('STOP'), tick: call(wait, 1000) }) if (!timer.stopped) { yield put(actions.tick()) } else { break } } 

рдЕрдм Rx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 interval(1000) .takeUntil(action$.ofType('STOP')) 


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╕рд╛рдЧрд╛ рдореЗрдВ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рд╣реИ:

 function* fetchSaga() { yield call(fetchUser); } while (yield take('FETCH')) { const fetchSaga = yield fork(fetchSaga); yield take('FETCH_CANCEL'); yield cancel(fetchSaga); } 

Rx рдкрд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:

 switchMap(() => fetchUser()) .takeUntil(action$.ofType('FETCH_CANCEL')) 

рдЕрдВрдд рдореЗрдВ, рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ред рдПрдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 2 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдХреЗ рд╕рд╛рде 5 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдЧрд╛рдУрдВ рдореЗрдВ рд╣реИ:

 for (let i = 0; i < 5; i++) { try { const apiResponse = yield call(apiRequest); return apiResponse; } catch (err) { if(i < 4) { yield delay(2000); } } } throw new Error(); } 

Rx рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

 .retryWhen(errors => errors .delay(1000) .take(5)) 

рдпрджрд┐ рдЖрдк рдЧрд╛рдерд╛ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:



рд╕рдЧрд╛ рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдореЗрдВ рдЖрдк рд▓рдЧрднрдЧ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рд╕рд╛рдЧрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддреА рд╣реИред

Rx рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рд╣реИ:



рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрд░рдПрдХреНрд╕ рдПрдХ рдЬрд╛рджреБрдИ рд╣рдереМрдбрд╝рд╛ рдФрд░ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЖрд░рдПрдХреНрд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдирдП рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдХрдард┐рди рд╣реИ рдЬреЛ рдЖрд░рдПрдХреНрд╕ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╡реЗрдзрд╢рд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЖрдк рдЕрд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

 action$ .ofType('DELETE') .switchMap(() => Observable .fromPromise(deleteRequest) .map(() => ({ type: 'DELETE_SUCCESS'}))) 

рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рд▓рд┐рдЦрд╛, рдЬреЛ рдХрд╛рдлреА рд╕рд░рд▓ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ - рдЯрд╛рдЗрдк 'DELETE' рдХреА рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде, рдПрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдкрд░реАрдХреНрд╖рдХ рдиреЗ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХреА - рдХрднреА-рдХрднреА рдЬрдм рдЖрдкрдиреЗ рдбрд┐рд▓реАрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реНрд╡рд┐рдЪрдкреЙрдкрд░ рдСрдкрд░реЗрдЯрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрд░рдХреНрд╖рдгред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдХреБрдЫ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рдирдХрд╛ рдореИрдВ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрди рд╕рднреА рд╕реЗ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ Rx рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

  • рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред
  • рдкреНрд░рд▓реЗрдЦрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
  • рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЪреЗрдХ рдХрд░реЗрдВред
  • рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред
  • рддреЛрдк рд╕реЗ рдЧреМрд░реИрдпрд╛ рдХреЛ рдЧреЛрд▓реА рдордд рдЪрд▓рд╛рдирд╛ред

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


All Articles