Синхронные диалоги в Flex?

Как открыть синхронный диалог в Flex? Мне нужно вызвать функцию из внешнего интерфейса (JavaScript), которая откроет простой диалог в приложении Flex и вернет значение в соответствии с кнопкой, которую нажал пользователь (OK / Отмена).

Таким образом, это должно быть синхронным вызовом диалога, то есть вызов ожидает, пока пользователь не закроет диалог, подобный этому.

//This function is called by JavaScript
function onApplicationUnload():Boolean
{
  var result:Boolean;
  result = showDialogAndWaitForResult();
  return result
}

Кто-нибудь знает, как я могу это сделать? Я мог бы написать цикл, который ждет, пока диалог не установит флаг, а затем считывает результат, чтобы вернуть его, но должно быть что-то более элегантное и многоразовое для ожидания завершения других асинхронных вызовов.

Обновлено: К сожалению, обратный вызов не работает, поскольку функция JavaScript, вызывающая onApplicationUnload (), сама должна возвращать значение (аналогично функции onApplicationUnload () в Flex). Эта функция JavaScript имеет фиксированную подпись, поскольку она вызывается фреймворком, и я не могу ее изменить. Или другими словами: вызов из JavaScript в Flex также должен быть синхронным.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
5 206
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Flex не работает синхронно, так как это однопоточное приложение, и ему требуется, чтобы ваш код возвращал выполнение обратно в «ядро» для обработки пользовательского ввода и т. д.

Способ сделать это - сделать поведение вашего диалога асинхронным:

function onApplicationUnload():void
{
    showDialog(resultMethod);
}

function resultMethod(result:Boolean):void
{
    ExternalInterface.call("javaScriptCallback", [result]);
}

Функция JavaScript, вызвавшая onApplicationUnload (), также должна дождаться результата, чтобы его вернуть. У меня нет возможности изменить это на стороне JavaScript, так как у меня также есть функция, которая должна возвращать значение, которое передается в структуру приложения.

Yaba 09.10.2008 20:08

Тогда, как говорит Хермс, у вас нет возможности использовать Flex для решения этой проблемы, и вам придется вместо этого использовать диалог JavaScript. Прости за это.

David Arno 10.10.2008 12:29
Ответ принят как подходящий

Вы не можете этого сделать в Flex. Как упоминал Дэвид, Flex является однопоточным, поэтому вы не можете иметь свой функциональный блок во время обработки диалога.

Лучше всего использовать всплывающее окно Javascript. У вас будет гораздо меньше контроля над окном, но оно должно вести себя так, как вы хотите (блокировать функцию до тех пор, пока она не будет закрыта).

Хорошо ... в конце концов, я нашел возможное решение. Но, думаю, вряд ли все будут заниматься этим всерьез :-(

Решение фокусируется на использовании цикла while для проверки результата и последующего возврата функции, вызываемой JavaScript. Однако нам нужен способ уснуть в цикле while, пока мы ждем результата. Однако вызовы JavaScript синхронны. Теперь уловка состоит в том, чтобы «засыпать» в JavaScript, который также здесь не доступен напрямую, но может быть выполнен с помощью синхронного запроса XML Http, как описано в этом блог.

Как я уже сказал, я не буду рекомендовать это только в крайнем случае. Для моей проблемы я прибегал к уродливым всплывающим окнам JavaScript.

Вы можете имитировать синхронный диалог во флексе, открыв диалоговое окно и отключив все в фоновом режиме. Вы можете увидеть это в действии, если сделаете Alert.show("Hello World"); в приложении. Фон станет серым, и пользователь не сможет щелкнуть какой-либо пользовательский интерфейс в фоновом режиме. Приложение будет «ждать», пока пользователь не нажмет кнопку ОК.

Проблема не в этом. Проблема здесь в том, что функция продолжает работать, когда она открыла диалоговое окно, и, таким образом, нет реального способа дождаться возвращаемого значения диалогового окна, которое должно быть возвращено этой функцией.

Yaba 17.10.2008 19:32

Это должно отображаться, когда страница закрыта?

Mark Ingram 18.10.2008 00:27

Почти: он должен отображаться прямо перед закрытием страницы. И в зависимости от кода возврата вызова JavaScript (который вызывает функцию Flex, отображающую диалоговое окно), страница будет оставлена ​​или нет.

Yaba 21.10.2008 14:55

Пусть ваш диалог вызовет другую функцию в flex для обработки результата выбора пользователя:

private function deleteFileCheck():void
{
  Alert.show("Are you sure you want to delete this file?",
             "Confirm Delete",
             Alert.YES| Alert.NO,
             this, deleteFileHandler, null, Alert.NO);
}

private function deleteFileHandler(event:CloseEvent):void
{
    if (event.detail == Alert.YES)
    {
        ...do your processing here
    }
}

Пусть ваш код Flex использует событие для ожидания диалогового окна. В основном потоке зарегистрируйте обработчик событий, ожидающий закрытия диалогового окна. Нажав ОК в диалоговом окне, отправьте событие завершения диалогового окна.

С Cairngorm это примерно так:

В основном потоке:

CairngormEventDispatcher.getInstance().addEventListener(ClosingDialogCompleteEvent.DIALOG_COMPLETE, onClosingDialogComplete);

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

В обработчике закрытия диалога:

CairngormEventDispatcher.dispatchEvent(new ClosingDialogCompleteEvent(<parameters>));

Обработчик события:


public function onClosingDialogComplete (e: ClosingDialogCompleteEvent):void
{
   param1 = e.param1;
   param2 = e.param2;
   // etc.
   // Continue processing or set the global variable that signals the main thread to continue.
}

Чтобы это работало, необходимо определить класс ClosingDialogCompleteEvent. Частичный код класса:


package com. ... .event  // You define where the event lives.
{
import com.adobe.cairngorm.control.CairngormEvent;

public class ClosingDialogCompleteEvent extends CairngormEvent
{
    // Event type.
    public static const DIALOG_COMPLETE:String = "dialogComplete";

    public var param1:String;
    public var param2:String;

    public function ClosingDialogCompleteEvent(param1:String, param2:String)
    {
        super(DIALOG_COMPLETE);
        this.param1 = param1;
        this.param2 = param2;
    }
}
}

Ожидание события - лучший способ синхронизации в Flex. Он также хорошо работает для диалоговых окон при запуске. В приложении, предназначенном только для гибкости, это работает особенно хорошо.

Еще нужна еще одна функция ... Это не то, что мне нужно. Мне нужно вызвать функцию и дождаться возврата результата.

Yaba 26.04.2010 20:04

Я объяснил обходной путь для создания синхронного оповещения в гибком

http://reallypseudorandom.blogspot.com/2010/05/flash-asynchronous-alert-and-pause.html

Другие вопросы по теме