Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Упрощенный Deferred (https://javascript.ru/forum/project/22357-uproshhennyjj-deferred.html)

Riim 31.10.2011 10:28

x-yuri, ты приводишь пример для цепочек (как я понял), а как по твоему записывать отслеживание окончания двух и более действий? Т. е. как бы ты записывал вот это:

var dfr1 = new Deferred(function() { console.log('dfr 1'); });
var dfr2 = new Deferred(function() { console.log('dfr 2'); });
 
Deferred.when(dfr1, dfr2).then(function() { console.log('dfr all'); });
 
setTimeout(function() { dfr1.resolve(); }, 2000);
setTimeout(function() { dfr2.resolve(); }, 5000);

x-yuri 31.10.2011 11:21

Цитата:

Сообщение от Riim
а как по твоему записывать отслеживание окончания двух и более действий?

с помощью Deferred, просто передо мной никогда не стояли такие задачи, поэтому и интересуют конкретные варианты применения (может в nodejs...)

Riim 31.10.2011 12:46

Цитата:

Сообщение от x-yuri
поэтому и интересуют конкретные варианты применения

мне понадобилось для отслеживания окончания нескольких анимаций.

x-yuri 31.10.2011 14:43

Цитата:

Сообщение от Riim
мне понадобилось для отслеживания окончания нескольких анимаций.

это не конкретный пример, или другими словами, мне непонятно, что это за анимации, для меня он не конкретный

Riim 31.10.2011 17:03

Цитата:

Сообщение от x-yuri
это не конкретный пример, или другими словами, мне непонятно, что это за анимации, для меня он не конкретный

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

Вот кусок, который меня беспокоит:
// если есть общий oncomplete
if (options && options.oncomplete) {
	// запоминаем его на массиве в котором лежат потоки анимации
	anim.oncomplete = options.oncomplete;
	// options потом попадет в new Animation, записываем в него обработчик, который при каждом вызове пробегает по всем потокам и, если все завершены, вызывает общий обработчик.
	options.oncomplete = function() {
		if (anim.every(function(subanim) { return subanim._progress == 1; })) {
			anim.oncomplete();
		}
	};
}

x-yuri 31.10.2011 17:31

Цитата:

Сообщение от Riim
Мне не очень нравится, как у меня это там записано

а мне нравится :) а почему не нравится?

Riim 31.10.2011 18:16

Цитата:

Сообщение от x-yuri
а почему не нравится?

а хрен его знает, с комментариями вроде читабельно смотрится.

float 11.11.2011 07:01

всётаки решил отказаться от диферд листа.
цацка красивая. но чёт я подумал ещё раз - на основной инструмент не катит.
заюзал более простую концепцию:
сделал _.funcList();
и простейший диферд на основе его.
получается диферд это объект с 2-мя списками функций, который может выполнить только 1-н, 1-н раз.
получается то, что нужно в основном для ajax-а.(в фреймворке по крайней мере)

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

Riim 11.11.2011 15:26

Цитата:

Сообщение от float
сделал _.funcList();

закеж)

x-yuri 11.11.2011 16:20

Цитата:

Сообщение от float
сделал _.funcList();
и простейший диферд на основе его.

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


Часовой пояс GMT +3, время: 04:06.