Angular 组件中的 SSE 发射器传递错误

Posted

技术标签:

【中文标题】Angular 组件中的 SSE 发射器传递错误【英文标题】:SSE Emitter passing error in Angular Component 【发布时间】:2021-05-22 06:07:54 【问题描述】:

我正在尝试在 Spring Boot 中实现 SSE(服务器端事件发射器)。应用程序在浏览器中运行良好,但是当我以 Angular 代码调用应用程序时,它最终出错了。 我的 Spring Boot 代码来自https://howtodoinjava.com/spring-boot2/rest/spring-async-controller-sseemitter/

@RestController
public class DataSetController 
 
      private final DataSetService dataSetService;
 
      public DataSetController(DataSetService dataSetService) 
            this.dataSetService = dataSetService;
      
 
      @GetMapping("/emit-data-sets")
      public SseEmitter fetchData2() 
      
            SseEmitter emitter = new SseEmitter();
 
            ExecutorService executor = Executors.newSingleThreadExecutor();
 
            executor.execute(() -> 
            
                  List<DataSet> dataSets = dataSetService.findAll();
                  try 
                        for (DataSet dataSet : dataSets) 
 
                              randomDelay();
                              emitter.send(dataSet);
                        
 
                        emitter.complete();
 
                   catch (IOException e) 
                        emitter.completeWithError(e);
                  
            );
            executor.shutdown();
            return emitter;
      
 
      private void randomDelay() 
            try 
                  Thread.sleep(1000);
             catch (InterruptedException e) 
                  Thread.currentThread().interrupt();
            
      

我的 Angular 代码来自此链接 https://bartoszgajda.com/2019/12/22/angular-and-server-sent-events-sse/

export class HomeComponent implements OnInit 
  constructor(private sseService: SseService) 

  ngOnInit() 
    this.sseService
      .getServerSentEvent("http://localhost:8082/raw")
      .subscribe(data => console.log(data),
       error => console.log("The code errors out here")
       );
  

响应来自控制台,如下所示

请帮助我,为什么代码最终会出错?服务器代码在浏览器中运行良好,这是 Angular 还是 Spring Boot 的问题?

【问题讨论】:

是emitter.completeWithError(e);在服务器上被调用? 不,它没有被调用 你可以尝试做同样的事情,但没有执行者。只需在发射器中发射你想要的一切并返回它 我试过还是一样的错误。它被执行了四次,错误出现在角度 【参考方案1】:

我使用这里提到的链接解决了它

https://octoperf.com/blog/2019/10/09/kraken-server-sent-events-reactive/#sse-and-angular

【讨论】:

以上是关于Angular 组件中的 SSE 发射器传递错误的主要内容,如果未能解决你的问题,请参考以下文章

Angular 8 组件嵌套在同一个组件事件发射器内

将数据传递到 Angular1 应用程序中的降级 Angular2 组件

如何在Angular中的路由组件之间传递数据

如何在不使用角度的ng的情况下将输入值从父组件传递给子组件?

Angular 2:从子组件直接发射到父组件的脚本文件

父子组件信息传递(子传父)