#javascript #asynchronous #air
#javascript #асинхронный #air
Вопрос:
Я создаю приложение в AIR с использованием JavaScript. Для многих моих функций требуется текст, возвращаемый собственным процессом. Но собственный процесс в AIR выдает значения асинхронно, вызывая функцию при событии STANDARD_OUTPUT_DATA. Есть ли какой-либо способ получить это значение синхронно, например, ожидание функции до завершения ее выполнения.
Вот пример кода :
var textReceived;
function callbackFunction()
{
textReceived= getTextfromProcess();
}
function chkProc()
{
process.addEventListener(STANDARD_OUTPUT_DATA, callbackFunction);
//This is AIR's function which give text asynchronously
}
function sqlExc(sql)
{
chkProc();
//wait here before returning
return textReceived;
}
Поскольку JavaScript выполняется в одном потоке, я не могу использовать бесконечный цикл с break.
Есть ли какой-либо способ добиться этого?
Ответ №1:
NativeProcess не имеет блокирующих (синхронных) методов. Кстати, бесконечный цикл здесь не поможет — чтобы позволить среде выполнения обрабатывать события, клиентский код должен завершить все функции. Только после завершения клиентского кода в текущем фрейме среда выполнения обменивается данными с собственным процессом (и сетью, и всем остальным).)
Комментарии:
1. «Только после завершения клиентского кода в текущем фрейме», что это значит, поскольку я не использую никаких фреймов?
2. Нет, не кадры movieclip. Проигрыватель сам отрисовывает картинку кадр за кадром. Вы знакомы с концепцией «Flash elastic racetrack»? Если нет, погуглите — это обязательная вещь для разработчика Flash.
3. На самом деле в AIR вы можете написать приложение, используя JavaScript или action-script. Поскольку я знаком только с JavaScript, я пишу приложение на нем. И я уже упоминал об этом в вопросе. И теперь я преобразовал все приложение в асинхронную модель, поскольку я не могу найти никакого способа сделать это в JavaScript. Спасибо за вашу помощь
4. Elastic racetrack применим и к приложениям JS AIR. По сути, системный код не выполняется до тех пор, пока клиентский код не завершит работу со всеми прослушивателями событий, бесконечный цикл приведет только к зависанию приложения. У вас просто нет выбора, кроме как использовать асинхронную модель.