ফ্লাক্স স্টোরগুলি, বা ক্রিয়াগুলি (বা উভয়) বাহ্যিক পরিষেবাগুলিকে স্পর্শ করা উচিত?


122

স্টোরগুলিতে তাদের নিজস্ব অবস্থা বজায় রাখা উচিত এবং নেটওয়ার্কিং এবং ডেটা স্টোরেজ পরিষেবাগুলিতে কল করার ক্ষমতা থাকতে হবে ... সেক্ষেত্রে ক্রিয়াগুলি কেবল মূক বার্তা পাসওয়ার্স,

-অথবা-

... কী কী স্টোরগুলি ক্রিয়াগুলি থেকে অপরিবর্তনীয় ডেটাগুলির বোবা প্রাপক হতে হবে (এবং ক্রিয়াকলাপগুলি বাহ্যিক উত্সগুলির মধ্যে ডেটা আনে / প্রেরণ করে? এই পরিস্থিতিতে স্টোরটি ভিউ-মডেল হিসাবে কাজ করবে এবং তাদের সামগ্রিক / ফিল্টার করতে সক্ষম হবে) ক্রিয়া দ্বারা খাওয়ানো যায় এমন অপরিবর্তনীয় ডেটার উপর তাদের নিজস্ব বেস বেস স্থাপনের আগে ডেটা।

আমার কাছে মনে হয় এটি এক বা অন্য হওয়া উচিত (উভয়ের মিশ্রণের চেয়ে)। যদি তা হয় তবে কেন একজনকে অন্যের চেয়ে পছন্দ / প্রস্তাব দেওয়া হয়?


2
এই পোস্টটি কোড
-

ফ্লাক্স প্যাটার্নের বিভিন্ন বাস্তবায়নের মূল্যায়নকারীদের জন্য আমি Redux github.com/rackt/redux স্টোরগুলিকে সর্বাধিক একবার দেখার জন্য সুপারিশ করছি যেগুলি বর্তমান অবস্থায় গ্রহণ করে এবং সেই রাজ্যের একটি নতুন সংস্করণ নির্গত করে খাঁটি ফাংশন হিসাবে প্রয়োগ করা হয়। যেহেতু তারা খাঁটি ফাংশন সেগুলি নেটওয়ার্ক এবং স্টোরেজ পরিষেবাগুলি আপনার কাছে থেকে কল করা যায় কি না সে প্রশ্ন: তারা পারবে না।
প্ল্লেসদান

উত্তর:


151

আমি ফ্লাক্স প্যাটার্নটি উভয়ভাবেই প্রয়োগ করে দেখেছি এবং নিজেই দু'টি কাজ করার পরে (প্রাথমিকভাবে প্রাক্তন পদ্ধতির সাথে যেতে), আমি বিশ্বাস করি যে স্টোরগুলি ক্রিয়া থেকে ডেটা প্রাপক হওয়া উচিত, এবং লেখাগুলির অ্যাসিনক্রোনাস প্রসেসিংটি বাস করা উচিত কর্ম নির্মাতারা। ( অ্যাসিঙ্ক রিডগুলি আলাদাভাবে পরিচালনা করা যায় )) আমার অভিজ্ঞতায়, গুরুত্বের দিক থেকে এর কয়েকটি সুবিধা রয়েছে:

  1. আপনার স্টোরগুলি সম্পূর্ণ সিঙ্ক্রোনাস হয়ে যায়। এটি আপনার স্টোরের যুক্তিকে অনুসরণ করা অনেক সহজ এবং পরীক্ষার পক্ষে খুব সহজ করে তোলে — কেবলমাত্র কিছু প্রদত্ত রাজ্যের সাথে একটি স্টোর ইনস্ট্যান্ট করুন, এটি একটি ক্রিয়াকলাপ প্রেরণ করুন এবং প্রত্যাশা অনুযায়ী রাজ্যটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখুন। তদুপরি, প্রবাহের মূল ধারণাগুলির মধ্যে একটি হ'ল ক্যাসকেডিং প্রেরণগুলি প্রতিরোধ করা এবং এক সাথে একাধিক প্রেরণ প্রতিরোধ করা; আপনার স্টোরগুলি যখন অ্যাসিক্রোনাস প্রসেসিং করে তখন এটি করা খুব কঠিন।

  2. সমস্ত ক্রিয়া প্রেরণগুলি অ্যাকশন নির্মাতাদের কাছ থেকে ঘটে। আপনি যদি আপনার স্টোরগুলিতে অ্যাসিক্রোনাস অপারেশন পরিচালনা করেন এবং আপনি আপনার স্টোরগুলির অ্যাকশন হ্যান্ডলারগুলি সিঙ্ক্রোনাস রাখতে চান (এবং আপনার ফ্লাক্স একক-প্রেরণের গ্যারান্টি পাওয়ার জন্য হওয়া উচিত), আপনার স্টোরগুলিকে অ্যাসিঙ্ক্রোনাসের প্রতিক্রিয়ায় অতিরিক্ত সাফল্য এবং ব্যর্থ ক্রিয়াকলাপ চালানো উচিত প্রক্রিয়াকরণ। এর পরিবর্তে অ্যাকশন নির্মাতাদের এই প্রেরণাগুলি রাখলে অ্যাকশন নির্মাতাদের এবং স্টোরগুলির কাজ পৃথক করতে সহায়তা করে; তদুপরি, কোথা থেকে ক্রিয়াকলাপ প্রেরণ করা হচ্ছে তা নির্ধারণের জন্য আপনাকে আপনার স্টোর লজিকটি খনন করতে হবে না। এক্ষেত্রে একটি সাধারণ অ্যাসিনক্রোনাস ক্রিয়াকলাপটি এর মতো দেখতে পারে ( dispatchআপনি যে ফ্লাক্স ব্যবহার করছেন তার স্বাদের ভিত্তিতে কলগুলির বাক্য গঠনটি পরিবর্তন করুন ):

    someActionCreator: function(userId) {
      // Dispatch an action now so that stores that want
      // to optimistically update their state can do so.
      dispatch("SOME_ACTION", {userId: userId});
    
      // This example uses promises, but you can use Node-style
      // callbacks or whatever you want for error handling.
      SomeDataAccessLayer.doSomething(userId)
      .then(function(newData) {
        // Stores that optimistically updated may not do anything
        // with a "SUCCESS" action, but you might e.g. stop showing
        // a loading indicator, etc.
        dispatch("SOME_ACTION_SUCCESS", {userId: userId, newData: newData});
      }, function(error) {
        // Stores can roll back by watching for the error case.
        dispatch("SOME_ACTION_FAIL", {userId: userId, error: error});
      });
    }

    যুক্তি যা অন্যথায় বিভিন্ন ক্রিয়া জুড়ে নকল করা যেতে পারে সেগুলি একটি পৃথক মডিউলে উত্তোলন করা উচিত; এই উদাহরণে, সেই মডিউলটি হবে SomeDataAccessLayer, যা প্রকৃত অ্যাজাক্স অনুরোধটি পরিচালনা করে।

  3. আপনার কম অ্যাকশন নির্মাতাদের প্রয়োজন। এটি একটি বৃহত্তর চুক্তির চেয়ে কম, তবে ভাল লাগবে। # 2 তে উল্লিখিত হিসাবে, যদি আপনার স্টোরগুলিতে সিঙ্ক্রোনাস অ্যাকশন প্রেরণ হ্যান্ডলিং থাকে (এবং তাদের হওয়া উচিত), অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফলগুলি পরিচালনা করতে আপনাকে অতিরিক্ত ক্রিয়াকলাপ চালাতে হবে। অ্যাকশন স্রষ্টাদের কাছে প্রেরণগুলি করার অর্থ একটি একক ক্রিয়াকলাপী অ্যাসিঙ্ক্রোনাস ডেটা অ্যাক্সেসের ফলাফল নিজেই পরিচালনা করে সমস্ত তিনটি ক্রিয়াকলাপ প্রেরণ করতে পারে।


15
আমি মনে করি যে ওয়েব এপিআই কল (অ্যাকশন স্রষ্টা বনাম store স্টোর) এর উত্স যা সাফল্য / ত্রুটি কলব্যাকের দ্বারা একটি ক্রিয়া তৈরি করা উচিত তার চেয়ে কম গুরুত্বপূর্ণ। সুতরাং ডেটা প্রবাহ তখন সর্বদা: ক্রিয়া -> প্রেরণকারী -> স্টোর -> দর্শন।
ফিশারদেবদেব

1
কোনও এপিআই মডিউলে প্রকৃত অনুরোধ যুক্তি যুক্ত করা কি আরও ভাল / পরীক্ষা করা সহজ হবে? সুতরাং আপনার এপিআই মডিউল কেবল যে প্রতিশ্রুতি থেকে প্রেরণ করবে তা ফিরিয়ে দিতে পারে। অ্যাকশন নির্মাতা কেবলমাত্র প্রাথমিক 'মুলতুবি' কর্ম পাঠানোর পরে সমাধান / ব্যর্থতার ভিত্তিতে প্রেরণ করেন। যে প্রশ্নটি রয়ে গেছে তা হ'ল কীভাবে উপাদানগুলি এই 'ইভেন্টগুলি' শোনায় কারণ আমি নিশ্চিত নই যে অনুরোধের রাজ্যটি স্টোর করার জন্য মানচিত্র তৈরি করা উচিত।
ব্যাকডেস্ক

@ ব্যাকডেস্ক আমি উপরের উদাহরণে ঠিক তেমনটিই করি: একটি প্রাথমিক বিচারাধীন ক্রিয়া প্রেরণ করুন ( "SOME_ACTION"), একটি অনুরোধ করার জন্য একটি API ব্যবহার করুন ( SomeDataAccessLayer.doSomething(userId)) যা প্রতিশ্রুতি দেয় এবং দুটি .thenকার্যক্রমে অতিরিক্ত ক্রিয়া প্রেরণ করে। অনুরোধের রাজ্যটি (কম বেশি) মানচিত্রটি স্টোর সঞ্চয় করতে পারে যদি অ্যাপ্লিকেশনটির রাজ্যের স্থিতি সম্পর্কে জানতে প্রয়োজন হয়। অ্যাপ্লিকেশনগুলিতে এই মানচিত্রগুলি কীভাবে রয়েছে (উদাহরণস্বরূপ প্রতিটি মন্তব্যে পৃথক ত্রুটি রাষ্ট্র, একটি লা ফেসবুক, অথবা একটি বিশ্বব্যাপী ত্রুটির উপাদান রয়েছে)
মিশেল টিলি

@ মিশেল টিলি "ফ্লাক্সের মূল ধারণাগুলির মধ্যে একটি হ'ল ক্যাসকেডিং প্রেরণগুলি প্রতিরোধ করা এবং এক সাথে একাধিক প্রেরণ প্রতিরোধ করা; আপনার স্টোরগুলি যখন অ্যাসিনক্রোনাস প্রসেসিং করে তখন এটি করা খুব কঠিন" " এটা আমার জন্য একটি মূল বিষয়। ভাল বলেছ.

51

আমি এই প্রশ্নটি ফেসবুকে ডেভসদের কাছে টুইট করেছি এবং বিল ফিশারের কাছ থেকে পাওয়া উত্তরটি হ'ল:

ইউআই এর সাথে কোনও ব্যবহারকারীর মিথস্ক্রিয়াকে সাড়া দেওয়ার সময়, অ্যাকশন স্রষ্টার পদ্ধতিগুলিতে আমি async কল করব।

তবে আপনি যখন টিকার বা অন্য কোনও মানহীন চালক রাখেন তখন দোকান থেকে কলটি আরও ভাল কাজ করে।

গুরুত্বপূর্ণ জিনিসটি ত্রুটি / সাফল্য কলব্যাকের মধ্যে একটি ক্রিয়া তৈরি করা যাতে ডেটা সর্বদা ক্রিয়াসমূহের সাথে উত্পন্ন হয়


যদিও এটি উপলব্ধি করে, কোনও ধারণা কেন a call from store works better when action triggers from non-human driver ?
শার্প কোডার

@ শার্প কোডার আমি অনুমান করি আপনার যদি লাইভ-টিকার বা অনুরূপ কিছু থাকে তবে আপনাকে সত্যিই কোনও পদক্ষেপের দরকার নেই এবং আপনি যখন দোকান থেকে এটি করেন তখন আপনাকে সম্ভবত কম কোড লিখতে হবে, যেহেতু স্টোরটি তাত্ক্ষণিকভাবে রাজ্যে প্রবেশ করতে পারে & একটি পরিবর্তন প্রেরণ।
ফ্লোরিয়ান ওয়ান্ডেলবারন

8

স্টোরগুলিতে ডেটা আনার এবং স্টোরের ডেটা আপডেট হয়েছে এমন উপাদানগুলিতে সিগন্যাল সহ সমস্ত কিছু করা উচিত। কেন? কারণ ক্রিয়াগুলি তখন গুরুত্বপূর্ণ আচরণকে প্রভাবিত না করেই হালকা, ডিসপোজেবল এবং প্রতিস্থাপনযোগ্য হতে পারে। সমস্ত গুরুত্বপূর্ণ আচরণ এবং কার্যকারিতা স্টোরে ঘটে। এটি আচরণের সদৃশকেও প্রতিরোধ করে যা অন্যথায় দুটি খুব অনুরূপ তবে ভিন্ন ক্রিয়ায় অনুলিপি করা হবে। দোকানে আপনার হয় একক (হ্যান্ডলিং) সত্যের উৎস।

প্রতিটি ফ্লাক্স বাস্তবায়নে আমি দেখেছি ক্রিয়াগুলি মূলত ইভেন্ট স্ট্রিংগুলিকে বস্তুতে পরিণত করা হয়, যেমন traditionতিহ্যগতভাবে আপনার "অ্যাঙ্কর: ক্লিক" নামে একটি ইভেন্ট থাকে তবে ফ্লাক্সে এটি অ্যাঙ্করএকশনস হিসাবে সংজ্ঞায়িত হবে। ক্লিক করা। এগুলি এতটাই "বোবা" যে বেশিরভাগ বাস্তবায়নের মধ্যে এমন ঘটনা যা শোনা হয় সেখানে ঘটনা প্রেরণের জন্য পৃথক পৃথক ডিসপ্যাচার বস্তু রয়েছে have

ব্যক্তিগতভাবে আমি রিফ্লাক্সের ফ্লাক্স বাস্তবায়ন পছন্দ করি যেখানে পৃথক পৃথক ডিসপ্যাচার বস্তু এবং অ্যাকশন অবজেক্টগুলি নিজেরাই প্রেরণ করে না।


সম্পাদনা: ফেসবুকের ফ্লাক্স আসলে "অ্যাকশন স্রষ্টা" এ নিয়ে আসে যাতে তারা স্মার্ট ক্রিয়া ব্যবহার করে। তারা স্টোর ব্যবহার করে পেললোডও প্রস্তুত করে:

https://github.com/facebook/flux/blob/19a24975462234ddc583ad740354e115c20b881d/exferences/flux-chat/js/ferences/ChatMessageActionCreators.js#L27 (লাইন 27 এবং 28)

সম্পূর্ণ হওয়ার পরে কলব্যাকটি এই সময় পে-লোড হিসাবে আনা ডেটা দিয়ে একটি নতুন ক্রিয়াকলাপ শুরু করবে:

https://github.com/facebook/flux/blob/19a24975462234ddc583ad740354e115c20b881d/examples/flux-chat/js/utils/ChatWebAPIUtils.js#L51

সুতরাং আমি অনুমান করি যে এটিই আরও ভাল সমাধান।


এই রিফ্লাক্স বাস্তবায়ন কী? আমি এটা শুনিনি। আপনার উত্তর আকর্ষণীয়। আপনি বোঝাতে চাইছেন যে আপনার স্টোর প্রয়োগের এপিআই কলগুলি করার মতো যুক্তি থাকা উচিত এবং এই জাতীয় কিছু? আমি ভেবেছিলাম স্টোরগুলিতে কেবল ডেটা নেওয়া উচিত এবং তাদের মানগুলি আপডেট করা উচিত। তারা নির্দিষ্ট ক্রিয়াগুলিতে ফিল্টার করে এবং তাদের স্টোরগুলির কয়েকটি বৈশিষ্ট্য আপডেট করে।
জেরেমি ডি

রিফ্লাক্স ফেসবুকের ফ্লাক্সের একটি সামান্য প্রকরণ: github.com/spoike/refluxjs স্টোরগুলি আপনার অ্যাপ্লিকেশনটির পুরো "মডেল" ডোমেন পরিচালনা করে, ক্রিয়াগুলি / ডিসপ্যাটাচার্স যা কেবল একসাথে স্টিচ এবং আঠালো জিনিসগুলিকে পরিচালনা করে।
রিগু

1
সুতরাং আমি এই সম্পর্কে আরও কিছু সম্পর্কে ভাবছিলাম এবং (প্রায়) আমার নিজের প্রশ্নের উত্তর দিয়েছি। আমি এটিকে এখানে উত্তর হিসাবে যুক্ত করতাম (অন্যদের পক্ষে ভোট দেওয়ার জন্য) তবে দৃশ্যত আমি স্ট্যাকওভারফ্লোতে খুব কর্মফল-দরিদ্র এখনও কোনও উত্তর পোস্ট করতে সক্ষম হতে পারছি না। সুতরাং এখানে একটি লিঙ্কটি রয়েছে: groups.google.com/d/msg/reactjs/PpsvVPvhBbc/BZoG-bFeOwoJ
plaxdan

গুগল গ্রুপ লিঙ্কের জন্য ধন্যবাদ, এটি সত্যিই তথ্যবহুল বলে মনে হচ্ছে। আমি প্রেরণার মাধ্যমে যাচ্চার সব কিছুর আরও অনুরাগী এবং মূলত স্টোরটিতে একটি সাধারণ সরল যুক্তি, যা তাদের ডেটাগুলি আপডেট করে। @ রেগু আমি রিফ্লাক্স পরীক্ষা করব।
জেরেমি ডি

আমি আমার উত্তরটি বিকল্প দৃষ্টিতে সম্পাদনা করেছি। মনে হয় উভয় সমাধানই সম্ভব are আমি প্রায় অবশ্যই অন্যদের থেকে ফেসবুকের সমাধানটি বেছে নেব।
রিগু

3

আমি "বোবা" ক্রিয়াগুলির পক্ষে যুক্তি সরবরাহ করব।

আপনার অ্যাকশনগুলিতে ভিউ ডেটা সংগ্রহের জন্য দায়িত্ব রেখে, আপনি নিজের ক্রিয়াকে আপনার দর্শনগুলির ডেটা প্রয়োজনীয়তার সাথে জুটি দিন couple

বিপরীতে, জেনেরিক অ্যাকশনস, যা ঘোষণামূলকভাবে ব্যবহারকারীর অভিপ্রায় বা আপনার অ্যাপ্লিকেশনটিতে কিছু রাজ্য রূপান্তর বর্ণনা করে , কোনও স্টোরকে এই অভিপ্রায়টির প্রতিক্রিয়া ব্যক্ত করে এমন মতামতগুলির জন্য বিশেষভাবে তৈরি রাজ্যে রূপান্তরিত করতে দেয়।

এটি নিজেকে আরও অসংখ্য, তবে আরও ছোট, আরও বিশেষ স্টোরগুলিতে ndsণ দেয়। আমি এই স্টাইলের জন্য তর্ক করছি কারণ

  • এটি আপনাকে কীভাবে স্টোর ডেটা ব্যবহার করে তা আরও নমনীয়তা দেয়
  • "স্মার্ট" স্টোরগুলি, যা তাদের দেখায় এমন দর্শনের জন্য বিশেষীকরণ করা হয়, "স্মার্ট" ক্রিয়াকলাপগুলির তুলনায় জটিল অ্যাপ্লিকেশনগুলির জন্য ছোট এবং কম মিলিত হবে, যার উপর অনেকগুলি ভিউ সম্ভবত নির্ভর করে

কোনও স্টোরের উদ্দেশ্য হ'ল ডেটা সরবরাহ করা। "অ্যাকশন" নামটি আমাকে পরামর্শ দেয় যে এর উদ্দেশ্যটি আমার অ্যাপ্লিকেশনটিতে পরিবর্তন বর্ণনা করা।

মনে করুন আপনাকে কোনও বিদ্যমান ড্যাশবোর্ড ভিউতে একটি উইজেট যুক্ত করতে হবে, যা আপনার ব্যাকএন্ড দলটি সবে আউট করা হয়েছে এমন কিছু অভিনব নতুন সামগ্রিক ডেটা দেখায়।

"স্মার্ট" ক্রিয়াকলাপগুলির সাথে, আপনাকে নতুন "API" গ্রাস করতে আপনার "রিফ্রেশ-ড্যাশবোর্ড" অ্যাকশন পরিবর্তন করতে হবে। তবে একটি বিমূর্ত অর্থে "ড্যাশবোর্ড রিফ্রেশ" পরিবর্তন হয়নি not আপনার দর্শনগুলির ডেটা প্রয়োজনীয়তাগুলি যা পরিবর্তিত হয়েছে।

"বোবা" ক্রিয়াগুলির সাহায্যে আপনি নতুন উইজেট গ্রাস করার জন্য একটি নতুন স্টোর যুক্ত করতে পারেন এবং এটি সেট আপ করতে পারেন যাতে এটি যখন "রিফ্রেশ-ড্যাশবোর্ড" অ্যাকশন টাইপ পায় তখন এটি নতুন ডেটার জন্য একটি অনুরোধ প্রেরণ করে এবং এতে প্রকাশ করে নতুন উইজেট এটি প্রস্তুত একবার। এটি আমার কাছে বোধগম্য হয় যে যখন ভিউ লেয়ারটি আরও বা বিভিন্ন ডেটার প্রয়োজন হয় তখন আমি যে জিনিসগুলি পরিবর্তন করি সেগুলি সেই ডেটার উত্স: স্টোর।


2

গেরনের ফ্লাক্স- রিএ্যাক্ট -রাউটার-ডেমোতে 'সঠিক' পদ্ধতির একটি দুর্দান্ত ইউটিলিটি প্রকরণ রয়েছে।

একটি অ্যাকশনক্রিয়াটর একটি বাহ্যিক এপিআই পরিষেবা থেকে প্রতিশ্রুতি উত্পন্ন করে এবং তারপরে প্রতিশ্রুতি এবং তিনটি অ্যাকশন কনস্ট্যান্টকে dispatchAsyncএকটি প্রক্সি / বর্ধিত ডিসপ্যাচারের কোনও ফাংশনে পাস করে । dispatchAsyncসর্বদা প্রথম ক্রিয়া যেমন GET_EXTERNAL_DATA 'প্রেরণ করা হবে এবং প্রতিশ্রুতি ফিরে আসার পরে এটি' GET_EXTERNAL_DATA_SUCCESS 'বা' GET_EXTERNAL_DATA_ERROR 'প্রেরণ করবে।


1

আপনি যদি একদিন ব্রেট ভিক্টরের বিখ্যাত ভিডিও উদ্ভাবনী সম্পর্কিত যে ভিডিওটি দেখতে পান তার সাথে তুলনামূলকভাবে একটি বিকাশের পরিবেশ অর্জন করতে চান, তবে আপনার কোনও বোবা স্টোর ব্যবহার করা উচিত যা কোনও ডেটা স্ট্রাকচারের ভিতরে ক্রিয়া / ইভেন্টগুলির কেবলমাত্র প্রক্ষেপণ, কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই। আপনার স্টোরগুলি যদি রেডাক্সের মতো একই বৈশ্বিক অপরিবর্তনীয় ডেটা স্ট্রাকচারের সদস্য হয় তবে এটিও সহায়তা করবে ।

এখানে আরও ব্যাখ্যা: https://stackoverflow.com/a/31388262/82609

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.