javascript - لماذا استخدام Redux-Observable over Redux-Saga؟




reactive-programming (5)

لقد استخدمت Redux-Saga . من السهل تفسير الشفرة المكتوبة معها ، باستثناء أن وظيفة JS المولدة تعمل على تشويش رأسها من وقت لآخر. من خلال فهمي ، يمكن لـ Redux-Observable تحقيق وظيفة مشابهة تعالج الآثار الجانبية ولكن بدون استخدام وظيفة المولد.

ومع ذلك ، لا تقدم المستندات من Redux-Observable العديد من الآراء حول سبب تفوقها على Redux-Saga. أرغب في معرفة ما إذا كان عدم استخدام وظيفة المولد هو الفائدة الوحيدة لاستخدام Redux-Observable. وماذا يمكن أن يكون سلبيات ، مسكتك أو التنازلات من استخدام Redux-Observable بدلاً من Redux-Saga؟ شكرا مقدما.


Answers

أستخدم Redux-Observable فوق Redux-Saga لأن تفضل العمل مع الملاحظات عبر المولدات. أنا استخدمه مع RXJS ، وهي مكتبة قوية للعمل مع تيارات البيانات. فكر في الأمر مثل lodash للتزامن. من حيث أي سلبيات ، مسكتك وحلول وسط في اختيار واحد على الآخر ، إلقاء نظرة على هذه الإجابة من جاي فيلبس:

وقد وجدت redux-saga كمشروع أطول من redux-observable لذلك بالتأكيد واحدة نقطة بيع رئيسية. ستجد المزيد من الوثائق والأمثلة ، ومن المحتمل أن يكون لديك مجتمع أفضل للحصول على الدعم منه.

العداد هو أن المشغلين وواجهات برمجة التطبيقات التي تتعلمها في لعبة Redus-saga ليست قابلة للتحويل تقريبًا مثل تعلم RxJS ، والذي يتم استخدامه في كل مكان. redux-observable هو السوبر السوبر السوبر بسيط داخليًا ، إنه حقًا يمنحك طريقة طبيعية لاستخدام RxJS. لذلك إذا كنت تعرف RxJS (أو تريد) ، فهي مناسبة طبيعية للغاية.

نصيحتي في الوقت الحالي بالنسبة لمعظم الناس هو أنه إذا كان عليك أن تسأل أي واحد يجب عليك استخدامه ، ربما يجب عليك اختيار ريدو ساغا.


أقدر قابلية النقل عبر اللغات وأوقات التشغيل التي تمتلكها Rx. حتى إذا كان تطبيقك لن يغيّر اللغات ، فقد يرجع ذلك إلى مهنتك. احصل على أفضل رافعة مالية يمكنك تعلمها ، مهما كان حجمها بنفسك. انها بوابة كبيرة ل. صافي LINQ على وجه الخصوص.


Redux-Observable هي مكتبة مذهلة ، ونحن نستخدمها في الإنتاج لمدة 1.5 سنة دون أي مشاكل حتى الآن ، وهي قابلة للاختبار تمامًا ويمكن دمجها بسهولة مع أي إطار عمل. إننا نمتلك قنوات مقابس متوازية شديدة الحمل جدًا ، والشيء الوحيد الذي يوفر لنا من التجميد هو Redux-Observable

لدي 3 نقاط أود ذكرها هنا.

1. منحنى التعلم والتعقيد

Redux-saga بسهولة يتفوق على redux-obsable هنا. إذا كنت تحتاج فقط إلى طلب بسيط للحصول على ترخيص ، ولا تريد استخدام redux-thunk لبعض الأسباب ، يجب عليك التفكير في استخدام red--saga ، فمن السهل فهمه.

إذا لم تكن لديك معرفة مسبقة بـ "Observable" ، فستكون بمثابة ألم بالنسبة لك وسيقوم فريقك بدراستك :)

2. ما الذي يمكن أن يقدمه المرصد و RxJS بالنسبة لي؟

عندما يتعلق الأمر بالمنطق المتزامن غير المرغوب فيه هو السكين السويسري الخاص بك ، يمكن للملاحظة القيام بكل شيء تقريبا حرفيا بالنسبة لك. يجب ألا تقارنهم أبداً بالوعود أو المولدات ، إنها أقوى بكثير ، وهي نفس المقارنة بين أوبتيموس برايم وشفروليه.

وماذا عن RxJS؟ انها مثل lodash.js ولكن لمنطق async ، وبمجرد أن أنت لا تتحول أبدا إلى شيء مختلف.

3. تمديد رد الفعل

ما عليك سوى التحقق من هذا الرابط

http://reactivex.io/languages.html

يتم تنفيذ الامتداد التفاعلي لجميع لغات البرمجة الحديثة ، فهو مجرد مفتاحك للبرمجة الوظيفية.

حتى قضاء وقتك بحكمة تعلم RxJS واستخدام redux-observable :)


إخلاء المسؤولية: أنا واحد من مؤلفي ريدو- يمكن ملاحظته لذلك فمن الصعب بالنسبة لي أن تكون محايدة 100٪.

نحن لا نقدم في الوقت الحالي أي سبب يمكن إعادة رؤيته بشكل أفضل من ريدوكس ساغا لأنه ... ليس كذلك. 😆

ر ليرة لبنانية ؛ الدكتور هناك إيجابيات وسلبيات على حد سواء. سيجد الكثيرون بديهيا أكثر من الآخر ، لكن كلاهما معقد للتعلم بطرق مختلفة إذا كنت لا تعرف RxJS (التي يمكن ملاحظتها) أو المولدات / "الآثار كبيانات" (redux-saga).

إنهم يحلون المشكلة نفسها بطرق متشابهة للغاية ، ولكن لديهم بعض الاختلافات الجوهرية التي تصبح واضحة حقا بمجرد أن تستخدمها بما فيه الكفاية.

redux-observable يؤيد كل شيء تقريبا RxJS الاصطلاحية. لذلك إذا كان لديك معرفة RxJS (أو اكتسبها) ، فإن التعلم واستخدام redux-observable هو السوبر الطبيعي. وهذا يعني أيضًا أن هذه المعرفة قابلة للتحويل إلى أشياء أخرى بخلاف عملية redux. إذا قررت التبديل إلى MobX ، إذا قررت التبديل إلى Angular2 ، إذا قررت الانتقال إلى بعض X في المستقبل ، فإن الاحتمالات جيدة للغاية حيث يمكن أن يساعدك RxJS. وذلك لأن RxJS هي مكتبة عامة غير منسقة ، وبطرق كثيرة تشبه لغة برمجة في حد ذاتها - نموذج "برمجية" Reactive Programming بالكامل. RxJS موجودة منذ عام 2012 وبدأت كميناء Rx.NET (هناك "منافذ" في كل اللغات الرئيسية تقريبا ، انها مفيدة ).

يوفر redux-saga مشغلي الوقت نفسه ، لذلك في حين أن المعرفة التي تحصل عليها عن المولدات والتعامل مع الآثار الجانبية في أسلوب إدارة العملية هذا قابلة للتحويل ، لا يتم استخدام المشغلين الفعليين والاستخدام في أي مكتبة رئيسية أخرى. هذا مؤسف قليلاً ، لكن بالتأكيد لا ينبغي أن يكون مفصلاً للصفقات في حد ذاته.

كما أنه يستخدم "تأثيرات كبيانات" ( موصوفة هنا ) ، والتي قد يكون من الصعب الالتفاف حولها في البداية ، ولكن هذا يعني أن شفرة red-saga لا تقوم بالفعل بتأثير الآثار الجانبية نفسها. بدلاً من ذلك ، تعمل الدالات المساعدة التي تستخدمها على إنشاء كائنات تشبه المهام التي تمثل النية للقيام بالتأثير الجانبي ثم تقوم المكتبة الداخلية بتنفيذها لك. هذا يجعل الاختبار غاية في السهولة ، دون الحاجة إلى السخرية وجذابة للغاية بالنسبة لبعض الناس. ومع ذلك ، أنا شخصياً وجدت أنه يعني أن اختبارات الوحدة الخاصة بك تعيد تنفيذ الكثير من منطق saga الخاص بك - مما يجعل تلك الاختبارات ليست IMO مفيدة جدًا (لا يشارك هذا الرأي من قبل الجميع)

غالبًا ما يسأل الناس لماذا لا نفعل شيئًا من هذا القبيل مع ملاحظة قابلة للارتداد: بالنسبة لي ، فهي غير متوافقة بشكل أساسي مع Rx الاصطلاحي العادي. في Rx ، نستخدم عوامل التشغيل مثل .debounceTime() التي تلخص المنطق المطلوب للتنازل ، ولكن هذا يعني أننا إذا أردنا إنشاء إصدار منه لا يؤدي في الواقع إلى تنفيذ عملية النسخ ، وبدلاً من ذلك ينبعث عن كائنات المهمة مع النية ، فقدت الآن قوة آر إكس لأنك لا تستطيع فقط تشغيل المشغلين لأنهم سيعملون على كائن المهمة هذا ، وليس النتيجة الحقيقية للعملية. هذا حقا من الصعب شرحه بأناقة. يتطلب الأمر أيضًا فهمًا ثقافيًا لـ Rx لفهم عدم توافق المناهج. إذا كنت تريد شيئًا من هذا القبيل حقًا ، فراجع redux-cycles التي تستخدم cycle.js ومعظمها له تلك الأهداف. أجد أنه يتطلب الكثير من الاحتفالات لأذواقي ، لكني أشجعك على إعطائها فكرة إذا كانت تهمك.

كما ذكر ThorbenA ، أنا لا نخجل من الاعتراف بأن Redux-saga حاليا (10/13/16) القائد الواضح في إدارة التأثير الجانبي المعقد من أجل التكرار. وقد بدأ في وقت سابق ولديه مجتمع أكثر قوة. لذلك ، هناك الكثير من عوامل الجذب لاستخدام المعيار الفعلي على الطفل الجديد في المبنى. أظن أنه من الآمن أن تقول إن كنت تستخدم إما بدون علم مسبق ، فأنت في حالة من الارتباك. كلانا يستخدم مفاهيم متقدمة إلى حد ما ، بمجرد أن "تحصل" ، يجعل إدارة الآثار الجانبية المعقدة أسهل بكثير ، ولكن حتى ذلك الحين الكثير من التعثر.

أهم نصيحة يمكنني تقديمها هي عدم إدخال أي من هذه المكتبات قبل أن تحتاج إليها. إذا كنت تجري فقط مكالمات ajax بسيطة ، فربما لا تحتاج إليها. redux-thunk هو غبي بسيط للتعلم ويوفر ما يكفي للأساسيات - ولكن كلما ازدادت تعقيدًا أصبح الأمر أكثر صعوبة (أو حتى مستحيلاً) يصبح من أجل إعادة التفريخ. ولكن من أجل العديد من الطرق التي يمكن ملاحظتها / الملحمة ، فإنها تضيء أكثرها تعقيدا. هناك أيضا الكثير من الجدارة في استخدام redux-thunk مع أحد الآخرين (redux-observable / saga) في نفس المشروع! redux-thunk لأشياء بسيطة المشتركة الخاصة بك ، وبعد ذلك فقط باستخدام ريدو / الملحمة الملحمة للأشياء المعقدة. هذه طريقة رائعة للبقاء منتجين ، لذا فأنت لا تقاتل / تلاحم الملحمة للأشياء التي ستكون تافهة مع thunk redux.


هناك عدة طرق للتكرار من خلال مصفوفة في جافا سكريبت ، على النحو التالي:

ل- انها الاكثر شيوعا. كتلة كاملة من التعليمات البرمجية لحلقات

var languages = ["JAVA", "JavaScript", "C#", "Python"];
var i, len, text;
for (i = 0, len = languages.length, text = ""; i < len; i++) {
    text += languages[i] + "<br>";
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

بينما - حلقة في حين أن الشرط من خلال. يبدو أن الحلقة الأسرع

var text = "";
var i = 0;
while (i < 10) {
    text +=  i + ") something<br>";
    i++;
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

القيام / أثناء - أيضًا التكرار من خلال كتلة من التعليمات البرمجية أثناء تحقق الشرط ، سيتم تشغيله مرة واحدة على الأقل

var text = ""
var i = 0;
do {
    text += i + ") something <br>";
    i++;
}
while (i < 10);
document.getElementById("example").innerHTML = text;
<p id="example"></p>

الحلقات الوظيفية - forEach، map، filterأيضًا reduce(يتم تكرارها من خلال الدالة ، ولكن يتم استخدامها إذا كنت بحاجة إلى إجراء شيء ما مع الصفيف ، إلخ.

// For example, in this case we loop through the number and double them up using the map function
var numbers = [65, 44, 12, 4];
document.getElementById("example").innerHTML = numbers.map(function(num){return num * 2});
<p id="example"></p>

لمزيد من المعلومات والأمثلة حول البرمجة الوظيفية على المصفوفات ، انظر إلى مشاركة المدونة البرمجة الوظيفية في JavaScript: خريطة وتصفية وتقليل .





javascript redux reactive-programming redux-saga redux-observable