#promise #signalr #angular10
#обещание #signalr #angular10
Вопрос:
У меня проблема с моим Angular Promise<void>
в одном из моих сервисов.
Служба устанавливает соединение SignalR с концентратором сервера. И я жду, когда будет передана трансляция на концентратор для установления соединения:
export class SignalRService {
private hubConnection: signalR.HubConnection;
private url = environment.apiUrl 'messageHub';
private thenable: Promise<void>;
public startConnection = (): void => {
if (!this.hubConnection) {
const token = this.auth.getAuth().token;
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl(this.url, { accessTokenFactory: () => token })
.build();
this.startHubConnection();
this.hubConnection.onclose(() => this.connectionHubClosed());
}
};
private startHubConnection() {
this.thenable = this.hubConnection.start();
this.thenable
.then(() => console.log('Connection started!'))
.catch((err) => console.log('Error while establishing connection :('));
}
public broadcastGameState = (): void => {
this.thenable.then(() => {
const name = this.auth.getAuth().displayName;
let message = this.game.getGame();
this.hubConnection
.invoke('SendMessage', message)
.catch((err) => console.error(err));
});
};
Но после того, как я закрою свое соединение с:
public stopConnection = (): void => {
if (this.hubConnection) {
this.hubConnection.stop();
}
};
и снова используйте мой сервис, я больше не могу использовать свой thenable
и broadcastGameState
больше не жду его, выдавая ошибку:
Ошибка: не удается отправить данные, если соединение не находится в состоянии «Подключено».
Я не понимаю, почему?
Комментарии:
1. «и `broadcastGameState» больше не ждет его, выдавая ошибку» Ну, на данный момент это уже решенное обещание, оно должно просто выполняться сразу.
2. @xxh ты понял свою точку зрения и заставил меня задуматься, поэтому я нашел проблему 🙂 Описано в ответе.
3. Приятно слышать, удачи!
Ответ №1:
xxh вы поняли свою точку зрения и заставили меня задуматься, поэтому я нашел проблему 🙂 После вызова:
public stopConnection = (): void => {
if (this.hubConnection) {
this.hubConnection.stop();
}
};
при закрытии соединения вызывается:
private connectionHubClosed(): void {
//trigerred when lost connection with server
alert('todo: SignalR connection closed');
}
НО this.HubConnection по-прежнему имеет присвоенное значение, поэтому из-за if (!this.hubConnection)
new this.thenable
было пропущено.