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

Я пытаюсь сделать заметным, что при обнаружении ошибки это будет выполнено снова, но что-то заметил, когда «on_error ()» с оператором «retry» выполняется, это только повторно запускаетНаблюдаемый, но текущий экземпляр 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"

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

enter image description here

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

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

1 Ответ

0 голосов
/ 03 декабря 2018

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

Я знаю, что это не «элегантное» решение, но это идея, которую яхотите сделать, не могли бы вы помочь мне в этом?Как может быть лучше использовать библиотеку 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

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

...