Я знаю, что эти типы вопросов возникают довольно часто, но мне нужна помощь с механизмом ожидания в JavaScript. Я знаю, что решения на основе setTimeout собираются подойти, но я не уверен, как это сделать в моем случае.Предотвратить возврат до тех пор, пока не будет выполнено условие
Я пишу API, который использует WebSocket внутри. Существует метод connect(), который устанавливает WebSocket, и мне нужно заставить его не возвращаться до тех пор, пока не будет настроен WebSocket. Я хотел бы, чтобы он возвращал значение для того, было ли соединение успешным, но это не основная проблема.
Проблема, с которой я сталкиваюсь, заключается в том, что после того, как пользователь вызывает connect(), они могут вызывать другой метод, который полагается на правильную настройку WebSocket. Если это называется слишком ранним, возникает ошибка, указывающая, что объект не используется.
Мое текущее решение устанавливает «подключенный» флаг, когда я определил успешное соединение и каждый метод проверяет его в каждом методе. Если он не подключен, я добавляю вызов метода в очередь, которая проходит через тот же код, который устанавливает флаг. Это работает, но он вводит этот стиль кода во всех моих методах и также кажется неверным с точки зрения пользователя, поскольку вызов этих функций отложен. Кроме того, если есть другой код пользователя, который полагается на те вызовы, которые будут выполнены до того, как он доберется до них, он не будет вести себя так, как ожидалось.
Я занимаюсь своим мозгом, как справиться с этим делом. Самое простое решение - просто найти способ блокировать возврат из соединения до тех пор, пока WebSocket не будет настроен, но это не так, как JavaScript. Другой вариант состоял в том, чтобы заставить их предоставить остальную часть своего кода в обратном вызове, но в этом случае это выглядит странно. Может, я передумал?
Edit: Чтобы лучше проиллюстрировать мою проблему, вот пример того, что пользователь может сделать:
var client = new Client(options);
client.connect();
client.getServerStatus();
Метод getServerStatus() будет использование WebSocket внутри. Если WebSocket еще не настроен, пользователь получит эту непригодную для использования ошибку.
Как отключить пользовательские прерывания до тех пор, пока не будет настроен веб-сайт? Это волшебство асинхронного javascript, браузер имеет время, чтобы обновить dom при обработке ваших запросов. – Sebas
Как насчет того, чтобы попробовать сначала, а затем задать вопрос, если что-то пойдет не так? – Sebastien
вызовите «другой метод» из события подключения сокета вместо того же места, в котором находится init'd сокета ... – dandavis