جافاسكريبت - RXJS if مع observable كشرط
أريد استخدام Rx.Observable.if لتشغيل واحدة من اثنين من المراقبات في حال كانت المراقبة الشرطية تحل إلى صحيح أو خطأ.
ما أريد تحقيقه سيبدو شيئًا مثل هذا:
Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()
إذا أرسل conditionalObservable قيمة تالية ثم أكمل بقيمة صحيحة، يجب تشغيل firstObservable، وإلا يجب تشغيل secondObservable.
من الواضح أن هذا لا يعمل لأن Rx.Observable.if يتوقع شرطًا على شكل دالة، وليس observable. كيف يمكنني تحقيق نفس الوظيفة بالضبط في RXJS؟
ملاحظة: هذه المشكلة تكاد تكون نفسها تقريبًا لكنني لا أعتقد أنها موجزة بما فيه الكفاية لأن 1) يجب أن يكون لديك بيانان pausable و 2) ما لم تضف take(1) إلى المراقبات الشرطية الخاصة بك، لا يمكنك ضمان أن الشرطية لن تصدر المزيد من الأحداث القادمة. في رأيي، هذا حل مؤقت وعرضة للكثير من الأخطاء البشرية.
الإجابة رقم 1
إذا فهمت جيدًا، يمكنك تجربة شيء من هذا القبيل:
conditionalObservable.map(x => x.length > 0)
.last()
.flatMap(function(condition){
return condition ? firstObservable : secondObservable});
.subscribe()
أضفت الجزء last لأنك ذكرت أنك تريد اختيار الـ observable الخاص بك (الأول أم الثاني) على القيمة الأخيرة لـ conditionalObservable.
لست متأكداً من قيمة معامل if هنا، لأنه يبدّل بناءً على قيمة قياسية يجب إنتاجها بشكل متزامن بواسطة دالة المُحدد. لذلك، ما لم تستخدم تلك الدالة لإرجاع متغير يمكن الوصول إليه في الإغلاق، والذي يمكنك تعديله عند النقطة التي يتم تقييم شرطك فيها، فهو ليس مفيدًا جدًا برأيي. وحتى في تلك الحالة، يصبح محددك دالة غير نقية، وهو ليس ممارسة مثلى لأغراض الاختبار وما إلى ذلك.
الإجابة رقم 2
ما رأيك في استخدام switch؟
conditionalObservable
.map(x => x.length > 0 ? firstObservable : secondObservable)
.switch()
.subscribe(...)
أو flatMapLatest؟ إذا فهمت الوثائق جيدًا، فهذا سيقوم بنفس ما كان يقوم به السابق:
conditionalObservable
.flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
.subscribe(...)
