Асинхронная загрузка / обработка ошибок - PullRequest
1 голос
/ 14 января 2010

Допустим, у меня есть несколько объектов (например, миниатюры в матрице), и мне нужно загрузить некоторые файлы данных для всех этих объектов по сети (HTTP). Таким образом, каждая миниатюра имеет собственно миниатюрное изображение и, например, XML-файл.

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

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

Я использую AS3, но вопрос должен быть почти таким же для других языков, по крайней мере для объектно-ориентированных.

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

1 Ответ

2 голосов
/ 14 января 2010

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

interface Qable extends IEventDispatcher {
   function start()
   function stop()
}
interface Q extends Qable {
   function add(item:Qable):Q
   function remove(item:Qable):Q
   ...
}

var q1: Q = new Q
q1.add(new Qable(...))
q1.add(new Qable(...))

var q : Q = new Q
q.addEventListener(Event.COMPLETE, onComplete)
q.addEventListener(Event.ERROR, onError)
q.add(new Qable(...))
q.add(new Qable(...)).addEventListener(Event.Error, onItemXError)
q.add(m1)

q.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...