X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Поговорим об асинхронности
Arks
Arks
Topic Starter сообщение 18.1.2013, 0:07; Ответить: Arks
Сообщение #1


Итак, у нас есть простая задача - получить некий результат в определенное время. Например при работе с DOM. Как известно мы не может сразу после вставки DOM-элемента пользоваться его методами, т.к. браузеру требуется время на отрисовку и вставку элемента в DOM-модель. Таким образом javascript спокойно продолжит выполняться даже если элемент еще не "готов".
Возможно два варианта - синхронизация вызовов, в java есть отличное понимание как это делается(synchronized методы), но управления синхронизацией к сожалению нет в javascript(тут это достигается рекурсией) - и искуственная эмуляция готовых timetick's - те же setTimeout и setInterval.
Возможно я что-то упускаю, какие методы в javascript Вы знаете для синхронной/асинхронной работы.

Сразу хочу развеить миф о паттерне observer - он не дает того же эффекта как многопоточные приложения. Это значит что при зависании одного из callback'ов все дальнейшие точно так же полетят к чертям.
Возможно есть какая-то защита асинхронных вызовов помимо try-catch на предмет задания им лимита процессорного времени?
Также хотелось бы услышать ваше мнение по синхронизации методов. Скажем например у нас есть 3 ajax-запроса, и мы должны запустить 4-ый лишь когда любые два из них отработают. Более осязаемый пример в данном случае - пул запросов ограничивающий нагрузку еще на клиенте.
Какие решения Вы можете предложить для подобных ситуаций(observer observer'ом погоняет - не вариант т.к. слишком большие накладные расходы будут уходить на генерацию событий "генерации событий" :sarcastic:)?

Хороший пример из этой серии - yandex maps router. Передо мной встала задача обеспечить срабатывание user-defined события при завершении все callback'ов от построения разных маршрутов. К сожалению стороннее API не предусмотрело передачу пользовательских данных в callback. Как же выйти из этой ситуации?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Zippovich
Zippovich
сообщение 18.1.2013, 0:44; Ответить: Zippovich
Сообщение #2


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

а про начало я не понял - вы про domready?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
Topic Starter сообщение 18.1.2013, 1:29; Ответить: Arks
Сообщение #3


(Zippovich @ 18.1.2013, 03:44) *
а про начало я не понял - вы про domready?

Скорее про DOMContentLoaded и его эмуляцию. Собственно я и хочу услышать конкретику.


(Zippovich @ 18.1.2013, 03:44) *
можно в глобальной переменной хранить данные какие запросы вернулись или просто счетчик и вызывать из колбеков проверку этой переменной.

Вот в последнем обновлении я так и сделал. Но мне кажется этот способ неоптимальным. Вот пример(может нерабочий, не тестил, т.к. сам скрипт на работе). Но чтобы понять сойдет. Пример с тех же яндекс-карт который я написал в текущей реализации.


[JS]
function route(id) {
this.id = id;
this.value = undefined;
this.ended = undefined;
}
route.prototype.startCoords = [1,2];
route.prototype.routeExecute = function(coords) {
var route = this;
ymaps.route([this.startCoords[0],this.startCoords[1]], [coords[0],coords[1]], function(router) {
route.value = router.getLength();
route.ended = true;
}, function(error) {
route.ended = true;
});
}
routesNeedArray = [];
for(i in routesNeed) { //некий массив координат для построения маршрутов
routesNeedArray.push(new route(i));
routesNeedArray[i].routeExecute(routesNeed[i])
}
function allRoutesReady() {
var el, result = {};
for(it in routesNeedArray) {
el = routesNeedArray[it];
if(!el.ended) return false;
result[el.id] = el.value;
}
return result;
}

interv = setInterval(function(){
if(result = allRoutesReady()) {
clearInterval(interv);
onRoutesResult(result );
}
}, 200);

onRoutesResult = function(routerResults){....}


[/JS]

Чур тапками за отсутствие var не кидаться, я думаю тут все понятно по коду, просто лень было писать var
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Zippovich
Zippovich
сообщение 18.1.2013, 4:44; Ответить: Zippovich
Сообщение #4


не - я в такие дебри не лезу - больше jquery мучаю - мне domready хватает пока.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 24.4.2024, 21:04
Дизайн