Angular 9 служебная переменная изменяется на undefined после вызова функции в том же файле - PullRequest
0 голосов
/ 18 июня 2020

У меня есть интерфейс, определенный так:

export interface Action {
    (...args: any[]): void;
}

Служба, определенная так:

import { uuid } from 'uuidv4';
import { Action } from '../interfaces/action';
import { Injectable } from '@angular/core';

@Injectable({
    providedIn: 'root',
})
export class SocketService {
    private onMessage: Action[] = [];
    private socket: WebSocket = null;

    constructor() {
        this.socket = new WebSocket('ws://localhost:8080/1234');

        this.socket.onopen = this.OnOpen;
        this.socket.onmessage = this.OnMessage;
    }

    private OnMessage(message) {
        let json = JSON.parse(message.data);

        console.log(this.onMessage);
        if (this.onMessage) {
            this.onMessage.map((x) => x(json));
        }
        console.log(json);
    }

    public set OnMessageActions(action: Action) {
        console.log(this.onMessage);
        this.onMessage.push(action);
        console.log(this.onMessage);
    }

    private OnOpen() {
        console.log(this.onMessage);
        console.log('Connection opened');
        console.log(this.onMessage);
    }
}

затем, наконец, компонент, определенный как таковой:

import { Component, OnInit } from '@angular/core';
import { SocketService } from '../../services/socket.service';

@Component({
    selector: 'app-chat',
    templateUrl: './chat.component.html',
    styleUrls: ['./chat.component.scss'],
})
export class ChatComponent implements OnInit {
    messages: Object[] = [];

    public get ReadyState(): number {
        return this.socketService.Socket().readyState;
    }

    constructor(private socketService: SocketService) {}

    ngOnInit(): void {
        if (!this.socketService.Socket()) {
            return;
        }

        this.socketService.OnMessageActions = this.OnMessage;
    }

    OnMessage(message: any) {
        switch (message.type) {
            case 'history':
                this.messages = message.data;
                break;
        }
    }
}

Когда вызывается функция установки, в первом журнале консоли отображается пустой массив, что ожидается, происходит pu sh, а во втором журнале консоли отображается массив с 1 элементом. Опять же, ожидалось.

Проблема в том, что когда вызываются функции OnOpen и OnMessage, массив не определен.

Лог c за интерфейсом действий - это то, что я пытался отразить из действий C# / Unity.

1 Ответ

0 голосов
/ 18 июня 2020

Потому что this контекст в вашей функции OnOpen не относится к экземпляру SocketService

Давайте попробуем переписать вашу OnOpen функцию следующим образом

OnOpen = () => {
     const _this = this
     console.log(_this.onMessage)
}
...