Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Добрый день.
Есть несколько наболевших вопросов по Javasсript.
1) Как сделать паузу?
• Не разрывая поток вычислений (т.е. setTimeout не подходит).
• Не используя бесконечные циклы (жрут проц дай боже).
2) Как вклинить в поток ответ от сервера?
1. Получить строку от пользователя.
2. Отправить её на сервер.
3. В зависимости от ответа, вернуть из функции нужное значение.
Как это сделать в одном потоке?
Вот просто на примере.
Есть vk, у него есть api.
И есть функция "check_vk", которая проверяет, соответствует ли строка правильному формату (id + циферки).
Методом jsonp (добавляя на страницу тег sсript с нужным значением src) я получаю ответ от сервера.
Но проблема в том, что получаю я его _после_ того, как закончится текущее вычисление (в котором мне этот ответ нужен).
----------------
Т.е. по-хорошему, это должно выглядеть так:
• Получил строку.
• Отправил на сервер.
• Получил ответ.
• В зависимости от ответа сделал нужный return.
Чтобы можно было простым check_vk(var) в других функциях проверять формат строки.
Но я вот упираюсь в то, что скрипт добавляется сразу, а ответ обрабатывается (или выполняется добавленный скрипт) - после того, как завершится вызов check_vk, который этот скрипт на страницу добавил.
И как это дело разрешить - я не знаю.
Пока что, единственное найденное решение весьма "такое себе" - повторный вызов check_vk при потере полем фокуса. Т.к. на момент второго вызова - ответ от сервера уже получен и лежит в переменной.
Есть несколько наболевших вопросов по Javasсript.
1) Как сделать паузу?
• Не разрывая поток вычислений (т.е. setTimeout не подходит).
• Не используя бесконечные циклы (жрут проц дай боже).
2) Как вклинить в поток ответ от сервера?
1. Получить строку от пользователя.
2. Отправить её на сервер.
3. В зависимости от ответа, вернуть из функции нужное значение.
Как это сделать в одном потоке?
Вот просто на примере.
Есть vk, у него есть api.
И есть функция "check_vk", которая проверяет, соответствует ли строка правильному формату (id + циферки).
Методом jsonp (добавляя на страницу тег sсript с нужным значением src) я получаю ответ от сервера.
Но проблема в том, что получаю я его _после_ того, как закончится текущее вычисление (в котором мне этот ответ нужен).
----------------
Т.е. по-хорошему, это должно выглядеть так:
• Получил строку.
• Отправил на сервер.
• Получил ответ.
• В зависимости от ответа сделал нужный return.
Чтобы можно было простым check_vk(var) в других функциях проверять формат строки.
Но я вот упираюсь в то, что скрипт добавляется сразу, а ответ обрабатывается (или выполняется добавленный скрипт) - после того, как завершится вызов check_vk, который этот скрипт на страницу добавил.
И как это дело разрешить - я не знаю.
Пока что, единственное найденное решение весьма "такое себе" - повторный вызов check_vk при потере полем фокуса. Т.к. на момент второго вызова - ответ от сервера уже получен и лежит в переменной.
Я очень сильно начинающий в JS, но у нас на работе есть проект на Реакте, который я ковыряю. И когда у меня такая же проблема возникла, то оказалось, что в сетевом методе, который делался асинхронно (из-за чего и происходила подобная ситуация), есть вторым параметром колбэк. И если этот колбэк дождаться, то как раз и получается, что мы ждём ответ от сервера и на основе него делаем дальнейшие действия.
Чуть подробнее: вот в Реакте есть такая штука как state: reactjs.org/docs/state-and-lifecycle.html - мы пишем в state: this.setState({ changes: {} }, this.метод-который-надо-сделать-после-установки-стейта);
Имхо, причина именно в этом - в современном JS все взаимодействия с сетью должны происходить асинхронно чтобы не блочить main thread
2. Промисы, промисы и ещё раз промисы.
Если на голом JS - то хороший пример есть здесь.
Вкратце, как это работает: создаём объект, который делает некое действие, и обещает когда-нибудь вызвать коллбэк в случае успеха (и другой коллбэк в случае провала). Делается это, конечно, в отдельном потоке.
- получаем строку (подозреваю, что в onchange текстового поля)
- отправляем на сервер, получая взамен Promise
- когда от сервера придёт ответ, у Promise сработает коллбэк, описанный в then, в котором
- в зависимости от ответа сделаем нужное действие, например, установим нужному полю ввода зелёненький фон, если всё правильно или красный, если неправильно.
Ладно, спасибо за ответ.