0

我正在尝试制作一个可观察的,当检测到错误时,这将再次执行,但确实注意到了一些事情,当执行带有“重试”运算符的“on_error()”时,这只会再次重新运行 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 对象,当触发错误时,这可能会再次重新启动,但会破坏当前对象,以防止堆栈溢出异常

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

4

1 回答 1

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

无堆栈溢出异常错误

于 2018-12-03T02:14:17.607 回答