سؤال

إليك رمز Scala لدي حاليا:

val b= comptionable.interval (1 ثانية) .map (n=> إذا (n٪ 2== 1) رمي استثناء جديد آخر n * n)

b.subscribe (n=> println (n)، e=> println ("خطأ")، ()=> println ("القيام به"))

وهنا خرج بلدي:

0
خطأ

كيف يمكنني تعديل ملاحظتي بحيث ستواصل كل خطأ وسأواجه إخراج مثل هذا:

giveacodicetagpre.

هل كانت مفيدة؟

المحلول

يمكنك استخدام أحد معالجات الأخطاء المختلفة. أعتقد أنه في حالتك OnerrorFlatmap قد يكون الاختيار الصحيح:

Wiki

href="https://netflix.github.io/rxjava/javadoc/rx/observable.html#onerrorflatmap٪28rx.funcstions.func1٪29" rel="nofollow"> Javadoc / ص>

لسوء الحظ، onerrorflatmap ليس (اعتبارا من الإصدار 0.19.0) جزء من API Scala.

نصائح أخرى

كان لدي هذا السؤال نفسه، وشعر بخيبة أمل لأنه لم يكن هناك onerrorflatmap ل scala rx. لذلك أخذت طعنة في تنفيذ هذه الوظيفة بنفسي.

يظهر حلاي أدناه (انظر حلا). الطريقة الرئيسية هي هذا واحد:

giveacodicetagpre.

تفاصيل "استرداد" طريقة

الحجة الأولى "لاسترداد" هي المرحزة التي تريد مواصلة الضغط على الأحداث حتى بعد يلقي استثناء. حاولت كل طريقة النهج الأخرى، لكن هذا كان الوحيد الذي عمل من أجله أنا. في البداية كنت قد توقعت Onerrorreturn Scala Rx في تعيين أي خطأ في القيمة التي تمليها شفائدي وظيفة، ثم استمر، لكنني كنت في عداد المفقودين النقطة بأكملها من "العقد الملحوظ"، وهو ذلك يحتاج الملاحظ إلى التوقف عن إرسال أي أحداث أخرى بعد onjecteded، أو OnError. أي ملاحظ أن يستمر في ظهور الأحداث الخاصة بعد ظهور خطأ "مرضية" (وعلى النحو حسب الأصول من قبل مجتمع مهذبا)، كما تمت مناقشته هنا: https://github.com/reactivex/rxjava/wiki/phantom Operators # Onerrorflatmap

يتم لف حمولة المكالمات OnNext الناجحة بنجاح ()، في حين سيتم التعامل مع أي استثناء بواسطة Onerrorresumenext، والتي ستقوم بإنشاء دفق قابل للملاحظ متسلسل من (1) التفاف الملحوظ الخطأ، و (2) مثيل الهدف ملفوفا في مكالمة متكررة لاسترداد. أنا في البداية قلق بشأن العودية اللانهائية .. ولكن كل ذلك يعمل بشكل جيد.

القيود

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

giveacodicetagpre.

هنا هو إخراج جزئي من رمز الرمز أعلاه:

giveacodicetagpre.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top