আপনি না।
তবে ... আপনার রিডেক্স-সাগা ব্যবহার করা উচিত :)
ড্যান আব্রামভের উত্তরটি সঠিক, redux-thunk
তবে আমি রেডুএক্স-সাগা সম্পর্কে আরও কিছু কথা বলব যা বেশ অনুরূপ তবে আরও শক্তিশালী।
অত্যাবশ্যক ভিএস ঘোষণা
- ডোম : jQuery হ'ল অপরিহার্য / প্রতিক্রিয়া ঘোষণামূলক
- মনডস : আইও অপরিহার্য / নিখরচায় ঘোষণাযোগ্য
- রেডাক্স এফেক্টস :
redux-thunk
আবশ্যকীয় / redux-saga
এটি ঘোষণামূলক
যখন আপনার হাতে আইও মোনাড বা প্রতিশ্রুতির মতো কোনও কান্ড রয়েছে তখন আপনি সহজেই বুঝতে পারবেন না যে একবার কার্যকর করার পরে এটি কী করবে। থাঙ্ককে পরীক্ষা করার একমাত্র উপায় হ'ল এটি চালানো, এবং প্রেরককে (বা পুরো বাইরের বিশ্বের যদি এটি আরও স্টাফের সাথে ইন্টারঅ্যাক্ট করে ...) উপহাস করে।
আপনি যদি মক ব্যবহার করছেন তবে আপনি কার্যকরী প্রোগ্রামিং করছেন না।
পার্শ্ব প্রতিক্রিয়াগুলির লেন্সগুলির মাধ্যমে দেখা, মকগুলি হ'ল একটি পতাকা যা আপনার কোডটি অশুচি এবং কার্যকরী প্রোগ্রামারের চোখে কিছু প্রমাণিত হয়েছে। আমাদের আইসবার্গটি অক্ষত আছে তা পরীক্ষা করতে সহায়তা করার জন্য একটি লাইব্রেরি ডাউনলোড করার পরিবর্তে আমাদের চারপাশে যাত্রা করা উচিত। একজন হার্ডকোর টিডিডি / জাভা লোক একবার আমাকে জিজ্ঞাসা করেছিল যে আপনি ক্লোজুরে কীভাবে উপহাস করছেন। উত্তরটি হ'ল, আমরা সাধারণত করি না। আমরা সাধারণত এটি একটি চিহ্ন হিসাবে দেখতে পাই আমাদের কোডটি রিফ্যাক্টর করতে হবে।
সূত্র
সাগাগুলি (যেমন তারা বাস্তবায়িত হয়েছিল redux-saga
) ঘোষণামূলক এবং ফ্রি মোনাড বা প্রতিক্রিয়া উপাদানগুলির মতো, তারা কোনও মক ছাড়াই পরীক্ষা করা আরও সহজ।
এই নিবন্ধটি দেখুন :
আধুনিক এফপিতে, আমাদের প্রোগ্রামগুলি লেখা উচিত নয় - আমাদের প্রোগ্রামগুলির বিবরণ লেখা উচিত, যা আমরা তখন আত্মবিশ্বাস, রূপান্তর এবং ইচ্ছায় ব্যাখ্যা করতে পারি।
(আসলে, রেডাক্স-সাগা একটি হাইব্রিডের মতো: প্রবাহটি অপরিহার্য তবে এর প্রভাবগুলি ঘোষণামূলক)
বিভ্রান্তি: ক্রিয়া / ইভেন্ট / আদেশগুলি ...
সিকিউআরএস / ইভেন্টসোর্সিং এবং ফ্লাক্স / রেডাক্সের মতো কিছু ব্যাকএন্ড ধারণাগুলি কীভাবে সম্পর্কিত হতে পারে তা নিয়ে সীমান্ত বিশ্বে প্রচুর বিভ্রান্তি রয়েছে, কারণ ফ্লাক্সে আমরা "ক্রিয়া" শব্দটি ব্যবহার করি যা কখনও কখনও আবশ্যক কোড ( LOAD_USER
) এবং ইভেন্ট উভয়কেই উপস্থাপন করতে পারে ( USER_LOADED
)। আমি বিশ্বাস করি যে ইভেন্ট-সোর্সিংয়ের মতো আপনার কেবল ইভেন্ট প্রেরণ করা উচিত।
অনুশীলনে সাগা ব্যবহার করা
কোনও ব্যবহারকারী প্রোফাইলের লিঙ্ক সহ একটি অ্যাপ্লিকেশনটি কল্পনা করুন। প্রতিটি মিডলওয়্যারের সাথে এটি হ্যান্ডেল করার মূর্তিমান পদ্ধতিটি হ'ল:
redux-thunk
<div onClick={e => dispatch(actions.loadUserProfile(123)}>Robert</div>
function loadUserProfile(userId) {
return dispatch => fetch(`http://data.com/${userId}`)
.then(res => res.json())
.then(
data => dispatch({ type: 'USER_PROFILE_LOADED', data }),
err => dispatch({ type: 'USER_PROFILE_LOAD_FAILED', err })
);
}
redux-saga
<div onClick={e => dispatch({ type: 'USER_NAME_CLICKED', payload: 123 })}>Robert</div>
function* loadUserProfileOnNameClick() {
yield* takeLatest("USER_NAME_CLICKED", fetchUser);
}
function* fetchUser(action) {
try {
const userProfile = yield fetch(`http://data.com/${action.payload.userId }`)
yield put({ type: 'USER_PROFILE_LOADED', userProfile })
}
catch(err) {
yield put({ type: 'USER_PROFILE_LOAD_FAILED', err })
}
}
এই কাহিনী অনুবাদ করে:
প্রতিবার ব্যবহারকারীর নাম ক্লিক হয়ে গেলে ব্যবহারকারী প্রোফাইলটি আনুন এবং তারপরে লোড হওয়া প্রোফাইলের সাথে একটি ইভেন্ট প্রেরণ করুন।
আপনি দেখতে পাচ্ছেন, এর কিছু সুবিধা রয়েছে redux-saga
।
পারফরম্যান্সের ব্যবহারটি takeLatest
প্রকাশ করার জন্য যে আপনি কেবলমাত্র শেষ ব্যবহারকারী নামটির ডেটা পেতে আগ্রহী (ব্যবহারকারীর প্রচুর ব্যবহারকারীর উপর খুব দ্রুত ক্লিক করা হলে একযোগে সমস্যাগুলি হ্যান্ডেল করুন)। এই ধরণের জিনিস থাঙ্কস সহ শক্ত। আপনি takeEvery
যদি এই আচরণটি না চান তবে আপনি ব্যবহার করতে পারতেন ।
আপনি ক্রিয়া নির্মাতাদের শুদ্ধ রাখুন। নোট করুন এটি অ্যাকশনক্রিটারগুলি রাখার জন্য এখনও কার্যকর (সাগা put
এবং উপাদানগুলিতে dispatch
), কারণ এটি আপনাকে ভবিষ্যতে ক্রিয়া বৈধতা ( দৃ /়তা / প্রবাহ / টাইপস্ক্রিপ্ট) যুক্ত করতে সহায়তা করতে পারে।
আপনার কোডটি অনেক বেশি পরীক্ষামূলক হয়ে উঠেছে কারণ প্রভাবগুলি ঘোষিত হয়
আরপিসি-মতো কলগুলির মতো ট্রিগার করার জন্য আপনার আর দরকার নেই actions.loadUser()
। আপনার ইউআইকে কেবল কী ঘটেছে তা প্রেরণ করতে হবে। আমরা কেবল ইভেন্টগুলিতে আগুন জ্বালিয়েছি (সর্বদা অতীতে থাকি !) আর ক্রিয়া করি না। এর অর্থ হ'ল আপনি ডিকোপলড "হাঁস" বা বাউন্ডেড কনটেক্সট তৈরি করতে পারেন এবং সাগা এই মডুলার উপাদানগুলির মধ্যে সংযোগের স্থান হিসাবে কাজ করতে পারে।
এর অর্থ হ'ল আপনার মতামতগুলি পরিচালনা করা আরও সহজ কারণ কারণ কী ঘটেছে এবং ফলস্বরূপ কী হওয়া উচিত তার মধ্যে সেই অনুবাদ স্তরটি ধারণ করার জন্য তাদের আর দরকার নেই don't
উদাহরণস্বরূপ একটি অসীম স্ক্রোল ভিউ কল্পনা করুন। CONTAINER_SCROLLED
হতে পারে NEXT_PAGE_LOADED
, তবে আমাদের অন্য পৃষ্ঠাটি লোড করা উচিত কিনা তা স্থির করার সিদ্ধান্ত নেওয়া কি সত্যিই স্ক্রোলযোগ্য ধারকটির দায়িত্ব? তারপরে তাকে আরও জটিল সামগ্রীর বিষয়ে সচেতন হতে হবে যেমন শেষ পৃষ্ঠাটি সফলভাবে লোড হয়েছিল কিনা বা ইতিমধ্যে এমন কোনও পৃষ্ঠা রয়েছে যা লোড করার চেষ্টা করে, বা আরও কোনও আইটেম লোড করার জন্য অবশিষ্ট নেই? আমি এটি মনে করি না: সর্বাধিক পুনঃব্যবসায়ের জন্য স্ক্রোলযোগ্য ধারককে কেবল এটি স্ক্রোল করা হয়েছে তা বর্ণনা করা উচিত। কোনও পৃষ্ঠা লোড করা সেই স্ক্রোলটির একটি "ব্যবসায়িক প্রভাব"
কিছু তর্ক করতে পারে যে জেনারেটরগুলি স্থানীয় ভেরিয়েবলগুলির সাথে রিডেক্স স্টোরের বাইরে রাষ্ট্রীয়ভাবে লুকিয়ে রাখতে পারে, তবে আপনি যদি টাইমার ইত্যাদি শুরু করে থাঙ্কসের ভিতরে জটিল জিনিসগুলি অর্কেস্টেট করতে শুরু করেন তবে যাইহোক আপনার একই সমস্যা হতে পারে। এবং এমন একটি select
প্রভাব রয়েছে যা এখন আপনার রেডাক্স স্টোর থেকে কিছু রাজ্য পাওয়ার অনুমতি দেয়।
সাগাস সময়-ভ্রমণ হতে পারে এবং জটিল ফ্লো লগিং এবং ডি-সরঞ্জামগুলি সক্ষম করে যা বর্তমানে কাজ করা হচ্ছে। এখানে ইতিমধ্যে কার্যকর করা কিছু সাধারণ অ্যাসিঙ্ক ফ্লো লগিং রয়েছে:
Decoupling
সাগস কেবলমাত্র রেডুক্স থঙ্কগুলি প্রতিস্থাপন করছে না। এগুলি ব্যাকএন্ড / বিতরণ সিস্টেম / ইভেন্ট-সোর্সিং থেকে আসে।
এটি একটি খুব সাধারণ ভ্রান্ত ধারণা যে সাগাসগুলি এখানে আপনার রিডেক্স থঙ্ককে আরও ভাল টেস্টিবিলিটির সাথে প্রতিস্থাপন করতে এসেছে। আসলে এটি হ'ল রিডেক্স-সাগা সম্পর্কিত একটি বাস্তবায়ন বিশদ। পরীক্ষামূলকতার জন্য থ্যাঙ্কসের চেয়ে ঘোষণামূলক প্রভাবগুলি ব্যবহার করা ভাল, তবে সাগা প্যাটার্নটি আবশ্যকীয় বা ঘোষণামূলক কোডের শীর্ষে প্রয়োগ করা যেতে পারে।
প্রথম স্থানে, সাগাটি এমন একটি সফ্টওয়্যারের অংশ যা দীর্ঘ চলমান লেনদেনের (চূড়ান্ত ধারাবাহিকতা) এবং বিভিন্ন সীমান্ত প্রাসঙ্গিক (ডোমেন চালিত নকশার জার্গন) জুড়ে লেনদেনের সমন্বয় করার অনুমতি দেয়।
সীমানা বিশ্বে এটি সহজ করার জন্য, এখানে উইজেট 1 এবং উইজেট 2 রয়েছে বলে ধারণা করুন। যখন উইজেট 1 এ কিছু বোতাম ক্লিক করা হয়, তারপরে উইজেট 2 এ এর প্রভাব থাকতে হবে। 2 টি উইজেট একসাথে সংযুক্ত করার পরিবর্তে (যেমন উইজেট 1 এমন কোনও ক্রিয়া প্রেরণ করে যা উইজেট 2 কে লক্ষ্য করে), উইজেট 1 কেবলমাত্র তার বোতামটি ক্লিক করে প্রেরণ করে। তারপরে সাগা এই বোতামটির জন্য ক্লিক করুন এবং তারপরে উইজেট 2 সচেতন এমন একটি নতুন ইভেন্ট প্রেরণ করে উইজেট 2 আপডেট করুন।
এটি ইন্ডিয়ারেশনের একটি স্তর যুক্ত করে যা সাধারণ অ্যাপ্লিকেশনগুলির জন্য অপ্রয়োজনীয় তবে জটিল অ্যাপ্লিকেশনগুলিকে স্কেল করা আরও সহজ করে তোলে। আপনি এখন উইজেট 1 এবং উইজেট 2 বিভিন্ন এনএমপি সংগ্রহস্থলে প্রকাশ করতে পারেন যাতে তাদের ক্রিয়াকলাপের একটি রেজিস্ট্রি ভাগ করে না নিয়ে তাদের একে অপরের সম্পর্কে কখনও জানতে হবে না। 2 টি উইজেট এখন সীমাবদ্ধ প্রসঙ্গ যা পৃথকভাবে বেঁচে থাকতে পারে। সামঞ্জস্যপূর্ণ হওয়ার জন্য তাদের একে অপরের দরকার নেই এবং অন্যান্য অ্যাপ্লিকেশনগুলিতেও এটি পুনরায় ব্যবহার করা যেতে পারে। সাগা হ'ল দুটি উইজেটের মধ্যে সংযোগ স্থাপন যা আপনার ব্যবসায়ের জন্য অর্থবহ উপায়ে তাদেরকে সমন্বয় করে।
আপনার রেডাক্স অ্যাপ্লিকেশনটি কীভাবে গঠন করবেন সে সম্পর্কে কয়েকটি দুর্দান্ত নিবন্ধ, যার উপর ভিত্তি করে আপনি ডিকপলিং কারণে রেডাক্স-সাগা ব্যবহার করতে পারেন:
একটি কংক্রিট ইউজকেস: বিজ্ঞপ্তি সিস্টেম
আমি চাই আমার উপাদানগুলি অ্যাপ্লিকেশন বিজ্ঞপ্তিগুলির প্রদর্শনটি ট্রিগার করতে সক্ষম হোক। তবে আমি চাই না যে আমার উপাদানগুলি নোটিফিকেশন সিস্টেমের সাথে একত্রে মিলিত হোক যার নিজস্ব ব্যবসায়িক বিধি রয়েছে (একই সাথে প্রদর্শিত হবে সর্বোচ্চ 3 টি বিজ্ঞপ্তি, বিজ্ঞপ্তি সারিবদ্ধ, 4 সেকেন্ডের প্রদর্শন-সময় ইত্যাদি ...)।
আমি চাই না যে আমার জেএসএক্স উপাদানগুলি কোনও বিজ্ঞপ্তি কখন / লুকিয়ে থাকবে তা সিদ্ধান্ত নেবে। আমি এটিকে কেবল একটি বিজ্ঞপ্তির অনুরোধ করার ক্ষমতা দিয়েছি এবং জটিল নিয়মগুলি কাহিনীর ভিতরে রেখে দিই। থানস বা প্রতিশ্রুতি দিয়ে এই ধরণের স্টাফ প্রয়োগ করা বেশ শক্ত।
আমি এখানে বর্ণনা করেছি যে কীভাবে সাগা দিয়ে এটি করা যায়
একে সাগা বলা হয় কেন?
সাগা শব্দটি ব্যাকএন্ড ওয়ার্ল্ড থেকে এসেছে। আমি প্রথম দিকে দীর্ঘ আলোচনায় ইয়াসিনকে (রেডাক্স-সাগা রচয়িতা) পরিচয় করিয়েছিলাম ।
প্রথমদিকে, এই শব্দটি একটি কাগজ দিয়ে প্রবর্তিত হয়েছিল , বিতর্কিত লেনদেনের ক্ষেত্রে সাগা প্যাটার্নটি চূড়ান্ত ধারাবাহিকতা পরিচালনা করতে ব্যবহার করার কথা ছিল, তবে ব্যাকএন্ড বিকাশকারীরা এর ব্যবহারকে আরও বিস্তৃত সংজ্ঞাতে প্রসারিত করেছেন যাতে এটি এখন "প্রক্রিয়া পরিচালক" হিসাবেও আবৃত হয় প্যাটার্ন (কোনওভাবে আসল সাগা প্যাটার্নটি প্রক্রিয়া পরিচালকের একটি বিশেষ ফর্ম)।
আজ, "সাগা" শব্দটি বিভ্রান্তিকর কারণ এটি 2 টি পৃথক বিষয় বর্ণনা করতে পারে। এটি রিডেক্স-সাগায় ব্যবহৃত হওয়ায় এটি বিতরণকৃত লেনদেনগুলি পরিচালনা করার উপায় নয় বরং আপনার অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপকে সমন্বয় করার উপায় বর্ণনা করে। redux-saga
বলা যেতে পারে redux-process-manager
।
আরো দেখুন:
বিকল্প
আপনি জেনারেটর ব্যবহারের ধারণা পছন্দ করি না কিন্তু আপনি কাহিনী প্যাটার্ন এবং তার decoupling বৈশিষ্ট্য দ্বারা আগ্রহী, আপনার কাছে সঙ্গে একই অর্জন করতে পারেন redux-পর্যবেক্ষণযোগ্য যা নাম ব্যবহার করে epic
সঠিক একই প্যাটার্ন বর্ণনা করতে, কিন্তু সঙ্গে RxJS। আপনি যদি ইতিমধ্যে আরক্সের সাথে পরিচিত হন তবে আপনি ঠিক ঘরে বসে অনুভব করবেন।
const loadUserProfileOnNameClickEpic = action$ =>
action$.ofType('USER_NAME_CLICKED')
.switchMap(action =>
Observable.ajax(`http://data.com/${action.payload.userId}`)
.map(userProfile => ({
type: 'USER_PROFILE_LOADED',
userProfile
}))
.catch(err => Observable.of({
type: 'USER_PROFILE_LOAD_FAILED',
err
}))
);
কিছু রিডেক্স-সাগা দরকারী সংস্থান
2017 পরামর্শ দেয়
- রেডাক্স-সাগা কেবল এটির প্রয়োজনে ব্যবহার করবেন না। কেবল টেস্টেবল এপিআই কলগুলি মূল্যবান নয়।
- সর্বাধিক সাধারণ ক্ষেত্রে আপনার প্রকল্প থেকে অংশগুলি অপসারণ করবেন না।
yield put(someActionThunk)
এটি যদি বোধগম্য হয় তবে কিছুকে থামাতে দ্বিধা করবেন না ।
আপনি যদি রেডাক্স-সাগা (বা রেডাক্স-পর্যবেক্ষণযোগ্য) ব্যবহার করে ভীত হন তবে কেবল ডিকোপলিংয়ের প্যাটার্ন প্রয়োজন, রিডুএক্স-প্রেরণ-সাবস্ক্রাইব পরীক্ষা করুন : এটি প্রেরণ শোনার অনুমতি দেয় এবং শ্রোতার ক্ষেত্রে নতুন প্রেরণগুলি ট্রিগার করতে অনুমতি দেয়।
const unsubscribe = store.addDispatchListener(action => {
if (action.type === 'ping') {
store.dispatch({ type: 'pong' });
}
});