RXCPP,当我在可观察的范围内无限期地使用重试运算符时,堆栈溢出

时间:2018-12-02 19:36:22

标签: components reactive rxcpp

我试图使观察到的是,当检测到错误时,将再次执行该操作,但是确实注意到了某些情况,当执行带有“重试”运算符的“ on_error()”时,将仅重新运行可观察到的,但是,可观察到的当前实例仍在当前堆栈中,换句话说,它仍然处于活动状态

我确实做了测试以验证行为

#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
...

我也希望看到“销毁对象”的输出

我也有堆栈溢出异常

enter image description here

我的目标是,执行一个可观察对象,当触发错误时,可以重新启动该对象,但是销毁了当前对象,以防止堆栈溢出异常

也许还有另一种方法可以做到,您能帮我吗?

1 个答案:

答案 0 :(得分:0)

我找到了可能的解决方案,我只删除了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

没有堆栈溢出异常错误