@GizzaProger

Как вызывать методы класса только после авторизации?

Пишу обертку для api.
При инициализации объекта, я логинюсь на сервере. Далее должны вызываться методы объекта, которые без логина не работают. Сам логин занимает время и может возникнуть ситуация, что метод объекта уже вызвался, а логина еще нет.
Было бы отлично поместить методы, которые вызываются после инициализации в некий стак, который уже выполнять в callback функции логина. Возможно есть решение с asynс, но я его не знаю. Как решить данную проблему?

Вот исходный код

const sha256 =  require('js-sha256').sha256;

export default class Rocket {
    constructor(socketUrl, login, password) {
        // Задаем начальные параметры
        this.socketUrl = socketUrl
        this.connected = false
        this.socket = false
        this.response = false

        this.login = login
        this.password = password

        // Создаем сокет для общения с сервером
        this.createSocket()
        
        this.socket.onopen = () => {
            // Событие соеденения с сервером
            this.socketOnOpen()
        }

        this.socket.onmessage = e => {
            // Событие отправки сообщения на сервер
            this.socketOnMessage(e)
        }
        
    }

    socketOnOpen() {
        // Соеденяемся и логинимся на сервере
        this.connect()
        this.loginig(this.login, this.password)
    }
    
    socketOnMessage(e) {
        this.setLastMsg(e)
        console.log(this.response.msg)
        // Чтобы сервер не разорвал соеденение переодически отправляем ему pong
        this.pong()
    }

    createSocket() {   
        this.socket = new WebSocket(this.socketUrl)
    }

    connect() {
        let notConnect = !this.connected;
        if(notConnect) {
            this.send(
                {
                    "msg": "connect",
                    "version": "1",
                    "support": ["1"]
                }
            )
        } else {
            console.log("Соеденение уже установлено")
        }
    }

    loginig(login, password) {
        // Авторизация
        this.send(
            {
                "msg": "method",
                "method": "login",
                "id": "1",
                "params":[
                    {
                        "user": { "username": login },
                        "password": {
                            "digest": this.hesh(password),
                            "algorithm":"sha-256"
                        }
                    }
                ]
            } 
        )
    }

    loadHistory(roomId) {
        // Загружаем исторю комнаты
        this.send(
            {
                "msg": "method",
                "method": "loadHistory",
                "id": "loadHistory",
                "params": [ roomId, null, 50, { "$date": 1480377601 } ]
            }
        )
    }

    getMsgId(msg=false) {
        if(msg) {
            return msg.response.id
        }

        return this.response.id
    }

    setLastMsg(event) {
        this.response = JSON.parse(event.data)
    }

    send(msg) {
        // Отправка сообщения
        this.socket.send(JSON.stringify(msg))
    }

    pong() {
        // На ping отвечаем pong
        if(this.response.msg == "ping") {
            this.send({
                "msg": "pong"
            })
        }
    }

    hesh(str) {
        // Кодирует строку в формат sha256
        return sha256(str)
    }
}

  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 1
Seasle
@Seasle Куратор тега JavaScript
Помог - отметь решением \( ゚ヮ゚)/
class Some {
	constructor() {
		this.data = null;

		Promise.all([this.init()]).then(() => {
			this.start();
		});
	}

	start() {
		console.log('START', this.data);
	}

	async init() {
		const response = await fetch('https://jsonplaceholder.typicode.com/todos');

		this.data = await response.json();
	}
}

new Some();

loginig у Вас ничего не принимает от сервера, как Вы хотите узнать о завершении операции?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Admitad Projects Москва
от 130 000 до 200 000 ₽
Fundraise Up Санкт-Петербург
от 2 500 до 3 500 $
26 мая 2020, в 10:43
2000 руб./за проект
26 мая 2020, в 10:39
3333 руб./за проект
26 мая 2020, в 10:38
20000 руб./за проект