【问题标题】:Using Websocket Subscribe call multiple times?多次使用 Websocket 订阅调用?
【发布时间】:2019-03-25 01:26:50
【问题描述】:

我的 Web-socket-service.ts

import { Injectable } from '@angular/core';
import { OidcSecurityService } from 'angular-auth-oidc-client';
import { WebSocketSubject } from 'rxjs/observable/dom/WebSocketSubject';
import { environment } from './../../../environments/environment';



export class Headers {
  public name = 'Authorization';
  public value = 'Bearer ';
}


export class Request {
  public id: string;
  public method = 'GET';
  public path = 'EmployeeList/';
  public dataFormat = 'application/json';
  public headers: Headers;
  public data: Data;
  constructor(
    id,
    method,
    path,
    dataFormat,
    headers
  ) {
    this.id = id;
    this.method = method;
    this.path = path;
    this.dataFormat = dataFormat;
    this.headers = headers;
  }

}
@Injectable({
  providedIn: 'root'
})
export class WebSocketService {
  public serverMessages = new Array<Request>();
  public id = 12;
  public method = 'GET';
  public path = 'EmployeeList/';
  public dataFormat = 'application/json';
  public headers: Headers;
  public headersArray: Headers[]


  private socket$: WebSocketSubject<Request>;

  constructor(private oidcSecurityService: OidcSecurityService) {
    this.socket$ = new WebSocketSubject('url');
    this.headers = new Headers();
    this.headersArray =[];

    this.headers.value = this.headers.value.concat(this.oidcSecurityService.getToken());
    this.headersArray.push(this.headers);
    this.headersArray.push({name : 'request_id',value : Math.round (Date.now()/1000).toString()})

  }

  GetData() {
    debugger;
    this.path = 'EmployeeList/';
    const message = new Request(this.id, 'GET', this.path, this.dataFormat,  this.headersArray);
    console.log(message);
    message.data = null;
   this.socket$.next(message);
    return this.socket$;
  }

  InsertData(newData) {
    const message = new Request('', 'POST', this.path, this.dataFormat, this.headers);
    message.data = newData;
    this.socket$.next(message);
    return this.socket$;
  }
  UpdateData(SimData) {
    const message = new Request('', 'PUT', this.path, this.dataFormat, this.headers);
    message.data = SimData;
    this.socket$.next(message);
    return this.socket$;
  }
  DeleteDatabyID(Id) {
    this.path = `${'EmployeeList'}/${Id}`;
    const message = new Request(Id, 'Delete', this.path, '', this.headers);
    message.data = null;
    this.socket$.next(message);
    return this.socket$;
  }


  GetEmployeeReportData() {
    this.path = 'EmployeeReports/';
    const message = new Request(this.id, 'GET', this.path, this.dataFormat, this.headers);
    message.data = null;
    this.socket$.next(message);
    return this.socket$;
     }
    }

我的employeeListComponent.ts

import { Component, OnInit, ChangeDetectorRef } from "@angular/core";
import { MatSnackBar } from "@angular/material";

import {
  FormGroup,
  FormBuilder,
  FormControl,
  FormArray,
  Validators
} from "@angular/forms";
import "rxjs/add/operator/map";
import "rxjs/add/operator/toPromise";
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from "@angular/material";
import { OidcSecurityService } from "angular-auth-oidc-client";
import { Subscription } from "rxjs/Subscription";
import { WebSocketService } from "./../../core/services/web-socket.service";
import { Data } from "./../../core/services/web-socket.service";
import { DeleteComponent } from "./../delete/delete.component";



@Component({
  selector: "app-simulator",
  templateUrl: "./employeeList.component.html",
  styleUrls: ["./employeeList.component.scss"]
})

export class employeeListComponent implements OnInit {
  emplist;

  constructor(
    private socketService: WebSocketService,
    private oidcSecurityService: OidcSecurityService,
    private fb: FormBuilder,
    public snackBar: MatSnackBar,
    private changeDetect: ChangeDetectorRef,
    public dialog: MatDialog,

  ) {


  }

  ngOnInit() {

    this.GetemployeeList();

  }

  GetemployeeList() {
    this.socketService.GetData().subscribe(
      response => {
       this.emplist= response;
      },
      error => console.log(error)
    );
    this.changeDetect.detectChanges();
  }


  InsertEmployee() {
    let data = new Data();
    // data.name = "abc"
       ......

    this.socketService.InsertData(data).subscribe(
      () => {
        this.snackBar.open("employee Added Successfully!", "Success", {
          duration: 2000,
          verticalPosition: "top"
        });
      },
      error => console.log(error)
    );
    this.aviatorForm.reset();
    data = null;
  }

  UploadEmployee(empdata,id) {
    let data = new Data();
   // data.name = empdata.name
     .....
    this.socketService.UpdateData(data).subscribe(() => {
      this.snackBar.open("Simulator Updated Successfully!", "Success", {
        duration: 2000,
        verticalPosition: "top"
      });
    });
  }


  }

}

我的employeeReportsComponent.ts

import { Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';
import { MatPaginator, MatSort, MatTableDataSource } from '@angular/material';
import { SelectionModel } from '@angular/cdk/collections';
import { WebSocketService } from './../../core/services/web-socket.service';
import { Reports } from './Reports';

@Component({
  selector: 'app-reports',
  templateUrl: './employeeReports.component.html',
  styleUrls: ['./employeeReports.component.scss']
})
export class employeeReportsComponent implements OnInit {
  Reports;

  constructor(private socketService: WebSocketService) {

  }

  ngOnInit() {

    this.GetReports();
  }

  GetReports() {
    this.socketService.GetEmployeeReportData().subscribe((response) => {
      this.Reports = response;

      console.log(this.Reports);
    },
      (error) => (console.log(error))
    );
    this.changeDetect.detectChanges();
  }


}

我在关注this的文章

问题

当我用户多次订阅组件然后方法调用多次?

示例:当我使用三个订阅然后方法调用三次。 我做错了吗?

我遵循的结构是否正确?我是 Angular 新手。

【问题讨论】:

    标签: angular websocket rxjs angular6 subscribe


    【解决方案1】:

    【讨论】:

    • 感谢您的重播。但我使用了 WebsocketSubject .. 我使用了 socket$.next(message) 来调用数据库 api。我有两个组件都有订阅方法。那么我该如何实施请帮忙?
    【解决方案2】:

    基于rxjs doc,它不会在每个请求上创建一个新实例,只有当您在每个 WebSocketService 方法上调用new wocketSubject('url') 时,它才会为每个调用创建一个新实例,@ 987654323@ 正在返回带有在 RXJS 中称为 Hot Observable 的主题,这意味着它将在第一次订阅时开始,然后从那时起所有新订阅都会获取数据。

    在网络部分的 chrome 开发工具中,你可以看到它是否会创建一个新实例,如果你创建了一个新实例,它将创建一个新记录,如果你没有创建一个新实例,你会看到原始记录上的新消息。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多