2013-09-23 5 views
0

Я знаю, что эти типы вопросов возникают довольно часто, но мне нужна помощь с механизмом ожидания в JavaScript. Я знаю, что решения на основе setTimeout собираются подойти, но я не уверен, как это сделать в моем случае.Предотвратить возврат до тех пор, пока не будет выполнено условие

Я пишу API, который использует WebSocket внутри. Существует метод connect(), который устанавливает WebSocket, и мне нужно заставить его не возвращаться до тех пор, пока не будет настроен WebSocket. Я хотел бы, чтобы он возвращал значение для того, было ли соединение успешным, но это не основная проблема.

Проблема, с которой я сталкиваюсь, заключается в том, что после того, как пользователь вызывает connect(), они могут вызывать другой метод, который полагается на правильную настройку WebSocket. Если это называется слишком ранним, возникает ошибка, указывающая, что объект не используется.

Мое текущее решение устанавливает «подключенный» флаг, когда я определил успешное соединение и каждый метод проверяет его в каждом методе. Если он не подключен, я добавляю вызов метода в очередь, которая проходит через тот же код, который устанавливает флаг. Это работает, но он вводит этот стиль кода во всех моих методах и также кажется неверным с точки зрения пользователя, поскольку вызов этих функций отложен. Кроме того, если есть другой код пользователя, который полагается на те вызовы, которые будут выполнены до того, как он доберется до них, он не будет вести себя так, как ожидалось.

Я занимаюсь своим мозгом, как справиться с этим делом. Самое простое решение - просто найти способ блокировать возврат из соединения до тех пор, пока WebSocket не будет настроен, но это не так, как JavaScript. Другой вариант состоял в том, чтобы заставить их предоставить остальную часть своего кода в обратном вызове, но в этом случае это выглядит странно. Может, я передумал?

Edit: Чтобы лучше проиллюстрировать мою проблему, вот пример того, что пользователь может сделать:

var client = new Client(options); 
client.connect(); 
client.getServerStatus(); 

Метод getServerStatus() будет использование WebSocket внутри. Если WebSocket еще не настроен, пользователь получит эту непригодную для использования ошибку.

+1

Как отключить пользовательские прерывания до тех пор, пока не будет настроен веб-сайт? Это волшебство асинхронного javascript, браузер имеет время, чтобы обновить dom при обработке ваших запросов. – Sebas

+0

Как насчет того, чтобы попробовать сначала, а затем задать вопрос, если что-то пойдет не так? – Sebastien

+0

вызовите «другой метод» из события подключения сокета вместо того же места, в котором находится init'd сокета ... – dandavis

ответ

2

Сегодня, к сожалению, на самом деле Javascript не работает. В будущем (ECMA6) могут появиться новые языковые функции, которые более прямо затрагивают эту проблему. Однако на данный момент вы придерживаетесь принятого в настоящее время метода обработки асинхронных событий, который ограничен обратными вызовами. Вы также можете изучить «обещания» для обработки «callback hell», однако для этого вам понадобится библиотека.

И да, кажется, странно иметь обратные вызовы повсюду, особенно для кого-то нового для веб-программирования, но на самом деле это единственный способ сделать это на этом этапе (предполагая, что вы хотите использовать межсерверное решение).

0

«Подождите» - это почти ключевое слово, которое вы ищете. На самом деле это yield, который делает это. См. MDN's documentation.

+0

Будьте осторожны ... поддержка выхода ограничена http://kangax.github.io/ ES5-Compat стол/ES6/# Generators_ (выход) – neonstalwart

0

Там есть метод подключения(), который устанавливает WebSocket, и мне нужно, чтобы сделать его не возвращаться, пока после того, как WebSocket устанавливается

Это не произойдет, если вы не перепишем javascript.

Любой код, пытающийся отправить данные, должен проверить состояние сокета (я бы пошел с инкапсулированием сокета в объект, предоставив метод, который устанавливает переменную-член в событиях открытия/закрытия и опросит состояние эта переменная-член из внешнего кода).Кроме того, вы можете добавлять сообщения и обратные вызовы в очередь и обрабатывать очередь при подключении сокета.

Смежные вопросы