代码之家  ›  专栏  ›  技术社区  ›  Raymond Holguin

无法通过HttpInterceptor通过服务推送数据

  •  0
  • Raymond Holguin  · 技术社区  · 7 年前

    我创建了一个 MessageService 我将数据推入其中,然后由我的 app.main 向用户显示这些消息。当我在组件中使用此服务时,它运行良好。我想做的是把它移到 HttpInterceptor 将监控所有 HttpResponse 用于服务器消息,并将其推送到服务中供用户显示。

    这是我的服务:

    @Injectable()
    export class MessageService {
      private successMessageList = new Subject<string>();
      successMessages$ = this.successMessageList.asObservable();
    
      constructor() { }
    
      addSuccessMsg(msg: string) {
        this.setMsgs(this.successMessageList, msg);
      }
    
      private setMsgs(privMsgArray: Subject<string>, newMsgs: any) {
        let messages = [];
        messages.push(newMsgs);
    
        messages.forEach(message => privMsgArray.next(message));
        console.log(this.successMessageList);
      }
    }    
    

    这是我的HttpInterceptor

    @Injectable()
    export class MyHttp implements HttpInterceptor {
      constructor(private messageService: MessageService) {}
    
      intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).do((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
              if(event.body['successMsg']) {
                 this.messageService.addSuccessMsg(event.body['successMsg']);
              }
            }
          })
      }
    }
    

    这是我的 应用程序。主要的 它读取数据

    export class AppComponent implements OnInit {
      successMessages = [];
    
      constructor(private messageService: MessageService) { }
    
      ngOnInit(): void {
        this.messageService.successMessages$.subscribe(
          message => {
            console.log(message);
            setTimeout(() => {
              this.successMessages.push(message);
            });
          });
      }
    }
    

    通过一些控制台语句,我可以看到数据正在进入 messageService.setMsgs(...) 私人方法正确,但它永远不会到达我的 应用程序。主要的

    我注意到的一件事是 MessageService.setMsgs(..) 我放了一个控制台语句 successMessageList . 当我通过组件添加消息时,我得到的输出如下所示( 注释 这个 observers: Array(1) vs observers: Array(0) )

    Subject {_isScalar: false, observers: Array(1), closed: false, isStopped: false, hasError: false, …}
    

    但是当我通过 HttpInterceptor 我明白了

    Subject {_isScalar: false, observers: Array(0), closed: false, isStopped: false, hasError: false, …}
    

    如果您对正在发生的事情有任何想法,我们将不胜感激!

    我使用角度5

    1 回复  |  直到 7 年前
        1
  •  1
  •   Raymond Holguin    7 年前

    这个问题是百分之百的用户错误。在我的 app.main 组件I正在声明 messageService 作为一个 provider @Component 所以这项服务并不像我期望的那样是一个共享的单身。在我删除后,一切都按预期进行。