![]() |
"Архитектурное решение" асинхронной загрузки нескольких объектов?
Добрый день, вопрос в следующем:
Допустим у меня из разных мест должны загрузиться данные, содержащие об одном пользователе. Как лучше сделать проверку что и то, и то завершило загрузку? Если один лоадер, то понятное дело просто подписаться на событие Event.COMPLETE, а как быть с двумя? Чтобы проверяло, что оба загрузчика закончили свою работу. У меня пока два решения. И оба, прямо сказать, не очень меня вдохновляют: 1. Грузить другие данные только после завершения загрузки предыдущих, запускаем один лоадер, как только он закончил работу - запускаем другой. Минус очевиден - пропускная способность канала намного больше, чем требуется в данном случае, поэтому загрузка неоправданно увеличится по времени. 2. Держать два флага, содержащих информацию о том, загрузились ли загрузчик1 и загрузчик2. При выполнении загрузчика ставить его флаг в TRUE и проверять флаг другого, и если он к тому моменту равен TRUE, то переходить к требуемому коду (туда, где требуется загрузка всех данных). У этого способа минус в том, что уж больно "в лоб" да и код как то не очень удобочитаем получается. |
Реализацию нужно выбирать по задачам, но мне больше нравится второй вариант. Только достаточно одного флага. Когда сработало Event.COMPLETE, проверяем флаг: если false, то ставим в true; если true, то Event.COMPLETE уже срабатывало.
|
Попробуйте использовать загрузчик FPLoader: указываем список файлов, вызываем метод start и начинается загрузка. У загрузчика есть возможность выбрать сколько файлов грузить одновременно(сколько текущих потоков может работать одновременно). Иммется событие PROGRESS для каждого файла, и общий для всех. Документация лежит по той же ссылки.
|
Спасибо, полезная ссылка!
Жаль swc, посмотреть логику не получится) |
Есть еще bulkLoader и MaxLoader от greensocks. Мне лично больше всего нравиться последний. Желания написать что то свое для решения такой задачи у меня не возникало, все и так устраивает.
|
Я не придираюсь, но когда что-то делают в одно время называют синхронным.
Я просто все скопом вызываю и ставлю счетчик равным кол-ву вызовов. При ответе или ошибке уменьшаю его на 1 соответственно. При 0 - идем дальше. |
Цитата:
Async.applySync(function, array). Применяет синхронную функцию (т.е. возвращающую сразу "результат") к аргументам. Если что-то завершилось с ошибкой, считает, что вся операция завершилась с ошибкой (и вовзращает исходный код). Возвращает AsyncOperation. Async.applyAsync(function, arrray). Применяет асинхронную функцию к асинхронным аргументам. Например, мы загрузили данные и потом по ним будем грузить картинки. Возвращает AsyncOperation. Async.onComplete(AsyncOperation, function). Применяет функцию, когда асинхронная операция завершилась (с любым результатам). Ничего не возвращает. Async.onSuccess(AsyncOperation, function), Async.onFailure(AsyncOperation, function) - применяет функцию к результатам в случае успеха/ошибки. Небольшой бонус (совершенно на другом уровне). App.monitorOp(AsyncOperation). Умеет корреткно отображать "глобальное ожидание" приложения и выводить ошибки (считает ошибки фатальными). Итого, типичный код выглядит примерно так: Код AS3:
|
Можно посмотреть в сторону http://www.as3commons.org/as3-commons-async/index.html
|
| Часовой пояс GMT +4, время: 12:38. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.