RXCPP, переполнение стека, когда я действительно бесконечно использовал оператор повтора в наблюдаемом

Я пытаюсь сделать заметным, что при обнаружении ошибки, это будет выполнено снова, но что-то заметил, когда "on_error()" с оператором "retry" выполняется, это только повторно запустить Observable, но, текущий экземпляр Observable все еще находится в текущем стеке, другими словами, все еще жив

Я сделал тест, чтобы проверить поведение

#include <string>
#include "rxcpp/rx.hpp"

class test_class 
{
public:
    int a;
    test_class() {
       printf("Create Obj \n");
       a = 1;
    }
   ~test_class() {
       printf("Destroy Obj \n");
       a = 0;
   }
};

int main()
{
   // Create Observable request
   auto values = rxcpp::observable<>::create<std::string>(
        [&](rxcpp::subscriber<std::string> subscriber) {
           test_class test;
           while (subscriber.is_subscribed()) {
               std::exception_ptr eptr = std::current_exception();
               subscriber.on_error(eptr);
               int a;
               a = 2;
               subscriber.on_next("normal");
           }

     })
    .retry()
    .as_dynamic();


values.
    subscribe(
        [](std::string v) {
                          printf("OnNext: %s\n", v.c_str()); },
        [](std::exception_ptr ep) {
                printf("OnError: %s\n", rxcpp::util::what(ep).c_str()); },
        []() {
                    printf("OnCompleted\n"); });

}

Итак, мой вывод

Create Obj
Create Obj
Create Obj
Create Obj
...

Я ожидал увидеть выход "Destroy Obj", а также

также я получил исключение переполнения стека

Моя цель состоит в том, чтобы выполнить Observable Object, чтобы при возникновении ошибки ее можно было перезапустить снова, но уничтожив текущую, в порядке, чтобы предотвратить исключение переполнения стека.

Может быть, есть другой способ сделать это, не могли бы вы помочь мне?

1 ответ

Я нашел возможное решение, я только удаляю цикл внутри Observable и оператора повтора, затем я добавляю цикл в операции Subscribe

Я знаю, что это не "Элегантное" решение, но это идея, которую я хочу реализовать, не могли бы вы помочь мне в этом? Как может быть лучше использовать библиотеку RxCPP?

#include <string>
#include "rxcpp/rx.hpp"

class test_class
{
   public:
   int a;
   test_class() {
     printf("Create Obj \n");
     a = 1;
   }
   ~test_class() {
     printf("Destroy Obj \n");
     a = 0;
}
};

int main()
{
   // Create Observable request
   auto values = rxcpp::observable<>::create<std::string>(
        [&](rxcpp::subscriber<std::string> subscriber) {
        test_class test;
        //while (subscriber.is_subscribed()) {
             std::exception_ptr eptr = std::current_exception();
             subscriber.on_error(eptr);
             int a;
             a = 2;
             subscriber.on_next("normal");
        //}
   });
   //.retry()
   //.as_dynamic();

   for (;;) {
      values.
          subscribe(
              [](std::string v) {
                  printf("OnNext: %s\n", v.c_str()); },
              [](std::exception_ptr ep) {
                  printf("OnError: %s\n", rxcpp::util::what(ep).c_str()); },
              []() {
                  printf("OnCompleted\n"); });
   }
}

Вот мой вывод:

Create Obj
OnError: bad exception
Destroy Obj
Create Obj
OnError: bad exception
Destroy Obj

Без ошибки исключения переполнения стека

Другие вопросы по тегам