Код инициализации нашего приложения Flex выполняет серию асинхронных вызовов для проверки учетных данных пользователя, загрузки внешних данных, подключения к теме JMS и т. Д. В зависимости от контекста, в котором выполняется приложение, некоторые из этих вызовов не выполняются или выполнены с другими параметрами.
Поскольку все эти вызовы происходят асинхронно, код, управляющий ими, трудно читать, понимать, поддерживать и тестировать. Для каждого вызова нам нужен механизм обратного вызова, в котором мы решаем, какой вызов выполнить дальше.
Мне было интересно, экспериментировал ли кто-нибудь с упаковкой этих вызовов в исполняемые модули и наличием Fluent Interface (FI), который мог бы соединять и контролировать их.
С моей головы код может выглядеть примерно так:
var asyncChain:AsyncChain = execute(LoadSystemSettings)
.execute(LoadAppContext)
.if(IsAutologin)
.execute(AutoLogin)
.else()
.execute(ShowLoginScreen)
.etc;
asyncChain.execute();
AsyncChain будет деревом выполнения, построенным с помощью FI (и мы, конечно, можем также построить его без FI).
Это может быть интересной идеей для сред, работающих в однопоточной модели, таких как Flash Player, Silverlight, JavaFX ?, ...
Прежде чем погрузиться в код, чтобы попробовать, я надеялся получить какую-то обратную связь.
Обновление 19/03/2010 : Мы создали экспериментальный Task API в проекте Spring ActionScript, который обеспечивает контроль над асинхронными процессами. Мы будем рады получить обратную связь. http://www.springactionscript.org/docs/reference/html/the_operation_api.html#tasks