субъект поведения не определен в ионном 4 - PullRequest
0 голосов
/ 29 марта 2019

У меня есть простой сервис, называемый сокет-сервис

import { Injectable } from '@angular/core';
import { Socket } from 'ngx-socket-io';
import { AuthenticationService } from './authentication.service';
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class SocketsService {

  isConnected = false;
  isOnline = new BehaviorSubject(false);

  constructor(private socket: Socket,private authenticationService : AuthenticationService) {
   }

   connect(){
     console.log("connecting to socket server....")
    return new Promise((resolve, reject) => {
    if(!this.isConnected)
    {
      this.socket.connect();
      console.log("Authenticating socket server....")
      this.socket.emit('authentication', {"HESOYAM" : this.authenticationService.user, "AEZAKMI" : this.authenticationService.pass, 'type' : 'mobile-app' });
      this.isConnected=true;

      this.socket.on("authenticated",function(data){
        console.log("socket auth was succesful with data "+data);
        console.log(this.isOnline);
        //this.isOnline.next(true);
      })
    }
   })
  }

При выполнении this.isOnline.next(true); возвращается ошибка, что isOnline не определено. аналогично ведению журнала консоли this.isOnline печатает неопределенное в консоли. Я вызываю метод подключения со страницы

export class TabsPage implements OnInit {

  constructor(private socketService : SocketsService, private authenticationService : AuthenticationService) { }

  ngOnInit() {
    this.authenticationService.refershToken().then(()=>{
      this.socketService.connect()
    })    
  }

}

токен обновления определен следующим образом

refershToken(){    
return new Promise((resolve, reject) => {
 this.storage.get(user).then((user) => {
  this.storage.get(pass).then((pass) => {
    if(user && pass){
      console.log("refresing token")
      this.login(user,pass).subscribe((res: LoginInterface) => {      
        if(res.auth == true){
         this.save_login(user,pass,res.name,res.token)
         this.user = user
         this.pass = pass         
         resolve()    
        }else{
          throw new Error('Auth Failed');
        }
      })
    }   
  });
});

}) }

Полагаю, мне не хватает чего-то очень простого.

PS: я новичок в Typescript и Angular

1 Ответ

1 голос
/ 29 марта 2019

this объект потерян в вашем SocketsService в этой строке:

this.socket.on("authenticated",function(data){ } 

пожалуйста, измените функцию на лямбда-выражение, подобное этому

this.socket.on("authenticated", data =>{ })

почему, пожалуйста, обратитесь к https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

...