Angular 无法读取属性';下一个';未定义的。有棱角的重命名时出错

Angular 无法读取属性';下一个';未定义的。有棱角的重命名时出错,angular,Angular,我有一个Angular服务,它使用套接字发送数据,读取答案,然后将该答案发送给订阅者: import { Subject } from 'rxjs/Subject'; import { Injectable } from '@angular/core'; import * as io from 'socket.io-client'; import { DocumentService } from "./document.service"; import { Observable } fr

我有一个Angular服务,它使用套接字发送数据,读取答案,然后将该答案发送给订阅者:

    import { Subject } from 'rxjs/Subject';
import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';
import { DocumentService } from "./document.service";
import { Observable } from "rxjs/Observable";
import { SignatureRequest } from "../models/signature-request";
import { SignatureResponse } from "../models/signature-response";

@Injectable()
export class SignatureService {
    private socket;
    private response: Subject<SignatureResponse>;

    constructor(private documentService: DocumentService) {
        this.socket = new WebSocket("ws://localhost:13337/sign");

        this.socket.onmessage = this.onResponse;
    }

    onResponse(response) {
        let signatureResponse: SignatureResponse = JSON.parse(response.data);

        this.response.next(signatureResponse);
    }

    sign(pdfDocument: string, pin: string, duties: string, stampNumber: string): Observable<SignatureResponse> {
        let signatureRequest = new SignatureRequest();
        signatureRequest.PdfBase64 = pdfDocument;
        signatureRequest.Pin = pin;
        signatureRequest.Duties = duties;
        signatureRequest.StampNumber = stampNumber;

        this.socket.send(JSON.stringify(signatureRequest));

        this.response = new Subject<SignatureResponse>();
        this.socket.response = this.response;
        return this.response.asObservable();
    }
}
从'rxjs/Subject'导入{Subject};
从“@angular/core”导入{Injectable};
从“socket.io客户端”导入*作为io;
从“/document.service”导入{DocumentService};
从“rxjs/Observable”导入{Observable};
从“./models/SignatureRequest”导入{SignatureRequest};
从“./models/SignatureResponse”导入{SignatureResponse};
@可注射()
导出类签名服务{
专用插座;
私人回应:主体;
建造商(私人文档服务:文档服务){
this.socket=newwebsocket(“ws://localhost:13337/sign”);
this.socket.onmessage=this.onResponse;
}
onResponse(响应){
让signatureResponse:signatureResponse=JSON.parse(response.data);
这个.响应.下一个(签名响应);
}
符号(PDF文档:字符串、pin:字符串、职责:字符串、stampNumber:字符串):可观察{
让signatureRequest=新的signatureRequest();
signatureRequest.PdfBase64=pdfDocument;
signatureRequest.Pin=Pin;
签名请求。职责=职责;
signatureRequest.StampNumber=StampNumber;
this.socket.send(JSON.stringify(signatureRequest));
this.response=新主题();
this.socket.response=this.response;
返回此.response.asObservable();
}
}
我不得不进行一些重命名,最终得到的服务几乎完全相同,只是一些名称发生了变化。正如您可以看到的大多数“响应”=>“签名响应”和“请求”=>“签名请求”:

import { Subject } from 'rxjs/Subject';
import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';
import { DocumentService } from "./document.service";
import { Observable } from "rxjs/Observable";
import { SignatureSignRequest } from "../models/signature-sign-request";
import { SignatureSignResponse } from "../models/signature-sign-response";

@Injectable()
export class SignatureService {
    private signSocket;
    private signResponse: Subject<SignatureSignResponse>;

    constructor(private documentService: DocumentService) {
        this.signSocket = new WebSocket("ws://localhost:13337/sign");

        this.signSocket.onmessage = this.onSignResponse;
    }

    onSignResponse(response) {
        let signatureSignResponse: SignatureSignResponse = JSON.parse(response.data);

        this.signResponse.next(signatureSignResponse);
    }

    sign(pdfDocument: string, pin: string, duties: string, stampNumber: string): Observable<SignatureSignResponse> {
        let signatureRequest = new SignatureSignRequest();
        signatureRequest.PdfBase64 = pdfDocument;
        signatureRequest.Pin = pin;
        signatureRequest.Duties = duties;
        signatureRequest.StampNumber = stampNumber;

        this.signSocket.send(JSON.stringify(signatureRequest));

        this.signResponse = new Subject<SignatureSignResponse>();
        this.signSocket.response = this.signResponse;
        return this.signResponse.asObservable();
    }
}
从'rxjs/Subject'导入{Subject};
从“@angular/core”导入{Injectable};
从“socket.io客户端”导入*作为io;
从“/document.service”导入{DocumentService};
从“rxjs/Observable”导入{Observable};
从“./models/signature-sign-request”导入{SignatureSignRequest}”;
从“./models/signature-signresponse”导入{SignatureSignResponse};
@可注射()
导出类签名服务{
专用标志插座;
私人回应:主体;
建造商(私人文档服务:文档服务){
this.signSocket=newwebsocket(“ws://localhost:13337/sign”);
this.signSocket.onmessage=this.onSignResponse;
}
onSignResponse(响应){
让signatureSignResponse:signatureSignResponse=JSON.parse(response.data);
this.signResponse.next(signatureSignResponse);
}
符号(PDF文档:字符串、pin:字符串、职责:字符串、stampNumber:字符串):可观察{
让signatureRequest=new SignatureSignRequest();
signatureRequest.PdfBase64=pdfDocument;
signatureRequest.Pin=Pin;
签名请求。职责=职责;
signatureRequest.StampNumber=StampNumber;
send(JSON.stringify(signatureRequest));
this.signResponse=新主题();
this.signSocket.response=this.signResponse;
返回此.signResponse.asObservable();
}
}
版本1非常好用。但改名后,我得到了

无法读取未定义的属性“next”

错误。发生在

this.signResponse.next(signatureSignResponse)


到达。在这两个版本中,我都通过套接字得到了答案,但在第二个版本中,我得到了错误,数据没有传递给我的订阅者。有人知道哪里出了问题吗?也许我错过了一些重要的东西,需要在设置的其他部分包括或重命名。如果需要,请询问其他信息,因为我不熟悉angular,也不确定识别错误需要什么。谢谢。

发生这种情况可能是因为构造函数在sign函数之前调用,您在该函数中向
signResponse
声明新实例。在construcor中声明实例

constructor(private documentService: DocumentService) {
    this.signSocket = new WebSocket("ws://localhost:13337/sign");
    this.signResponse = new Subject<SignatureSignResponse>();

    this.signSocket.onmessage = this.onSignResponse;
}
构造函数(私有文档服务:文档服务){
this.signSocket=newwebsocket(“ws://localhost:13337/sign”);
this.signResponse=新主题();
this.signSocket.onmessage=this.onSignResponse;
}

谢谢您的回答。但它似乎不起作用。没有什么变化。此外,它没有解释为什么在版本1中它不在构造函数中声明实例就可以工作。