Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2011, 05:23
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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

Для этого вызываем функцию waiting, затем по цепочке вызываем метод wait. Аргументом waiting и wait служит колбек, определенный в примере, как runNext. Его вызов запускает очередную порцию кода.

Для проверки работы откройте консоль.
(function(){
	window.wait = function(first){
		return new (function(){
			var self = this;
			
			var callback = function(){
				var args;
				if(self.deferred.length) {
					args = [].slice.call(arguments);
					args.unshift(callback);
					self.deferred[0].apply(self, args);
					self.deferred.shift();
				}
			}
			
			this.wait = function(run){
				this.deferred.push(run);
				return self;
			}
			
			this.deferred = [];
			
			first(callback);
		})
	}	
	
	/* Пример */
	wait(function(runNext){
		console.log('Run 1');
		setTimeout(function(){
			runNext(1,2); //передаем какие-нибудь аргументы в следующий вызов
		}, 1000);
		
    }).wait(function(runNext, a, b){
		console.log('Run 2, a='+a+' b='+b ); //используем аргументы из предыдущего вызова
        setTimeout(runNext, 1000);
		
    }).wait(function(runNext){
		console.log('Run 3');
        setTimeout(function(){
			console.log('End 3')
			runNext();
		}, 1000);
		
    }).wait(function(runNext){
		console.log('Run 4');
		setTimeout(runNext, 1000);
		
	}).wait(function(){
		console.log('Last one');
		
	});
})();

Пример с анимациями http://jsfiddle.net/finom/XSGub/37/

Последний раз редактировалось FINoM, 22.12.2011 в 07:16.
Ответить с цитированием
  #2 (permalink)  
Старый 20.12.2011, 00:56
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Что-нибудь можешь прокомментировать по моей идеи?
http://habrahabr.ru/blogs/javascript...omment_4479560
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #3 (permalink)  
Старый 20.12.2011, 06:33
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

B~Vladi, то что ты предложил несколько выходит за рамки моих знаний, поэтому компетентного ответа я дать не могу.
Ответить с цитированием
  #4 (permalink)  
Старый 20.12.2011, 08:28
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Я всё-таки допилю до юзабельного варианта и выложу.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #5 (permalink)  
Старый 20.12.2011, 10:32
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

не слишком гибко, когда для вызова следующей функции из цепочки обязательно вызывать runNext. конечно, для передачи аргументов в следующий вызов она как раз подходит, но для того, чтобы просто вызвать следующую функцию (99%), потребутся вводить заветные буквы.

возможно ли ту функцию сделать необязательной ? как в этом случае будет обрабатываться время следующего вызова ?
Ответить с цитированием
  #6 (permalink)  
Старый 20.12.2011, 19:28
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

melky,
А как узнать, что тот же таймаут завершился? Только по коллбеку.
Сообщение от melky
возможно ли ту функцию сделать необязательной ? как в этом случае будет обрабатываться время следующего вызова ?
Ты имеешь в виду, если не указан колбек, то вызывать следующую функцию сразу?
Ответить с цитированием
  #7 (permalink)  
Старый 20.12.2011, 21:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

да. в этом случае можно указывать параметр, является ли блок кода полностью синхронным, или нет (ajax, напр.). если код async:false (default), если же он async:true - будьте добры тогда указать сами, когда он закончит исполнение (runNext)
Ответить с цитированием
  #8 (permalink)  
Старый 20.12.2011, 22:39
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Не знаю есть ли в этом смысл. В любом случае, придется писать
wait(function(){
    this.async = false;
})


вместо
wait(function(){
    this.next();
});
Ответить с цитированием
  #9 (permalink)  
Старый 21.12.2011, 00:26
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

вы правы. оно нафиг не нужно, потому что (я прикинул) для этого придётся дописывать много кода в вашу функцию, и вообще, "овчинка не стоит выделки",т.к. при таком подходе передача аргументов осложняется.
Ответить с цитированием
  #10 (permalink)  
Старый 21.12.2011, 13:36
Аватар для vflash
Профессор
Отправить личное сообщение для vflash Посмотреть профиль Найти все сообщения от vflash
 
Регистрация: 09.07.2007
Сообщений: 304

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

сейчас подумываю упростить. получается что-та вроде цепочки с паузами.


var sync = new ....;

setTimeout(sync(), 1000);
setTimeout(sync(), 100);

sync(function() {

});

setTimeout(sync(), 100);

var xx = sync();
sync(function() {
    ....
    setTimeout(xx, 1000);
    ....
});

sync(function() {

});
__________________
лучшая rss читалка zzreader.com
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой сайт. Логические игры. MininAS Ваши сайты и скрипты 45 20.09.2013 23:22
Оцените мой сайт: Большой Русский Форум ФОРУМ Ваши сайты и скрипты 2 16.05.2010 13:27
Мой сайтик маримьяна Ваши сайты и скрипты 4 15.04.2009 14:32
Синхронный запрос данных по AJAX Shasoft AJAX и COMET 2 03.03.2009 14:07