Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.10.2011, 00:25
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Новое поколение цепочек - ассинхронность
Пока фреймворк в стадии наполнения и допиливания, но в нем реализована полная ассинхронность цепочечных команд:

A=$().test('a').test('b').sync(true);
setTimeout(function(){
	A.sync(false);
	},1000)
A.test('c').sync(function(){
	this.sync(1000).test('e').test('f');
	console.log(11);
	return this;
	}).test('d').test('g');
console.log('end');
test: function(str){console.log(str)}

В логе следующее:
a
b
end
проходит секунда
c
11 - раздвоение потоков
d
g
проходит секунда
e
f


а еще на подходе очень мощные селекторы, которые уже не уступая Sizzle, чаще обгоняют его в 3-6 раз.

Теперь и в JS можно писать ассинхронно!
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт

Последний раз редактировалось PeaceCoder, 17.10.2011 в 00:27.
Ответить с цитированием
  #2 (permalink)  
Старый 17.10.2011, 01:20
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от PeaceCoder
Теперь и в JS можно писать ассинхронно!
Спасибо, поржал.

Теперь немного критики:
0) Для заценки своих проектов есть отдельная ветка форума

1) Вы не опубликовали ссылку на свой проект. Тем самым лишая нас возможность оценить проект получше, попробовать самим сч ним поигратся.

2) Как следствие из пункта 1: вы не привели ни какого намека даже на документацию. Из вашего кода и результата его работы остается только догадываться как именно работает и используется ваш фреймворк.
Метод sync у вас может принимать три типа параметров.
И достаточно трудно понять, как именно они работают.

Например, моим первым предположением было, что .sync(true) переключает очередь функций в синхронный режим.
Но, тогда непонятно, почему 'c' выводится после 'end', хотя в синхронном режиме оно вполне раньше должно сработать.
Через 5-10 минут анализа, я понял, что .sync(true) вообще останавливает очередь, до тех пор, пока не будет вызван .sync(false). Кстати, не удивлюсь, если я ошибся, и вообще другую идею вкладывали в .sync(true)
Без документации, или кода проекта остается только догадываться о том, как это все работает, и как используется.

3)Я не нашел в вашем примере асинхронности
Все пользовательские функции в вашем примере - синхронные
Может покажите, как в вашем фреймворке будет выглядеть набор из 3х последовательны AJAX запросов?
Ну или что-нибудь другое асинхронное?
Ответить с цитированием
  #3 (permalink)  
Старый 17.10.2011, 01:36
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Gvozd
Все пользовательские функции в вашем примере - синхронные
именно. они синхронно выполняются но задавать их можно ассинхронно.

$().sync().ajax(fn1).ajax(fn2).ajax(fn3)


При этом сам ajax ассинхронен, но их выполнение синхронно. В этом то и вся фишка будет. Можно задавать цепочку действий и не факт что она будет исполненна сразу. в каждом из звеньев может включится ассинхронность по времени, но исполнение все равно будет синхронно
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
  #4 (permalink)  
Старый 17.10.2011, 01:59
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от PeaceCoder
именно. они синхронно выполняются но задавать их можно ассинхронно.
может все-таки наоборот?
в вашем втором примере, вы синхронно задали выполнение трех AJAX-, запросов и обработчиков к ним.
Или между выполнением .ajax(fn1) и .ajax(fn2) может быть выполнен еще какой-нибудь код?
а вот выполняется код уже асинхронно(я ж полагаю, между срабатыванием fn1 и срабатыванием fn2 браузер не зависает, и может быть выполнен другой код?), хотя и последовательно(опять-таки предположение).

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


В общем, я правильно понял, что ваш фреймворк - это возможность задавать очередь функций, каждая из которых бы выполнилась бы в свою очередь, по порядку?
Чем ваша концепция лучше Deferred?
Ответить с цитированием
  #5 (permalink)  
Старый 17.10.2011, 02:10
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Gvozd
Или между выполнением .ajax(fn1) и .ajax(fn2) может быть выполнен еще какой-нибудь код?
а вот выполняется код уже асинхронно(я ж полагаю, между срабатыванием fn1 и срабатыванием fn2 браузер не зависает, и может быть выполнен другой код?), хотя и последовательно(опять-таки предположение).
все верно. браузер не виснет

Небыло никогда необходимости сделать ассинхронные запросы но что бы они были выполненныс последовательно?
для этого как все мы знаем, мы проделываем такое:

ajax({...,onSuccess:function(){ ajax({...,onSuccess}) }});

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

А отличие от Deffered? А я так и не понял что они там намутили. Суть моей системы в том что я могу цепочку из команд и каждая команда будет поочередно выполнятся, но не сразу друг за другом по времени.

Цитата:
Deferred Object, аналогично объекту jQuery, «цепочный» (chainable), но имеет свой набор методов
У меня же ассинхронность распространяется абсолютно на все методы обьекта.

А как такое реализует Deffered:

A=$().test('a').test('b').sync(true);
setTimeout(function(){
    A.sync(false);
    },1000)
A.test('c').sync(function(){
    this.sync(true).test('e').test('f');
    console.log(11);
    return this;
    }).test('d').test('g');
console.log('end');


В логе следующее:
a
b
end
проходит секунда
c
11
e
f
d
g

при этом this.sync(true).test('e').test('f'); может и не исполнятся тогда после "11" будет просто d и g
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт

Последний раз редактировалось PeaceCoder, 17.10.2011 в 02:41.
Ответить с цитированием
  #6 (permalink)  
Старый 17.10.2011, 04:47
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от PeaceCoder
А отличие от Deffered? А я так и не понял что они там намутили.
Упрощенный Deferred.
Ответить с цитированием
  #7 (permalink)  
Старый 17.10.2011, 04:53
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от PeaceCoder
Небыло никогда необходимости сделать ассинхронные запросы но что бы они были выполненныс последовательно?
для этого как все мы знаем, мы проделываем такое:
В некоторых задачах возникает такая необходимость
Для этого умные люди придумали Deferred
jQuery > 1.5
var url = 'http://ya.ru';
	var fn1 = function() {
		console.log('start1');
		return jQuery.ajax({
			url: url,
			success:function(res){console.log([1, res.length])}
		})
	};
	var fn2 = function() {
		console.log('start2');
		return jQuery.ajax({
			url: url,
			success:function(res){console.log([2, res.length])}
		})
	};
	var fn3 = function() {
		console.log('start3');
		return jQuery.ajax({
			url: url,
			success:function(res){console.log([3, res.length])}
		})
	};
	var def = jQuery.Deferred();
	def.pipe(fn1).pipe(fn2).pipe(fn3);
	def.resolve();

вывод
Код:
start1
[1, 6655]
start2
[2, 6655]
start3
[3, 6655]
Ответить с цитированием
  #8 (permalink)  
Старый 17.10.2011, 04:53
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от PeaceCoder
А как такое реализует Deffered:
Например как-то так
function test(a){
		return function(){console.log(a);}
	}
	
	var pause = $.Deferred();
	A = A.pipe(test('a')).pipe(test('b')).pipe(function(){return pause;})
	setTimeout(function(){
		pause.resolve();
		},1000)
	A.pipe(test('c')).pipe(function(){
		var tmp = $.Deferred();
		tmp.pipe(test('e')).pipe(test('f'));
		console.log(11);
		
		tmp.resolve();
		return tmp;
	}).pipe(test('d')).pipe(test('g'));
	console.log('end');

Замечания о том, что этот код делает не тоже, что и ваш код, рассматриваются только после того, как вы дадите ответы на следующие вопросы:
а)что все-таки делают на самом деле .sync(true) .sync(false) ?
б) почему this.sync(true).test('e').test('f') может выполнится, а может и нет? от чего это зависит
в) Если я правильно понял(догадался) работу .sync(true), то после него не будут выполнены ни .test('e').test('f'), ни .test('d').test('g'); до тех пор, пока не будет вызван еще один .sync(false)
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2011, 04:54
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

И вообще, вы очень ловко съехали, не отреагировав на мои первое и второе замечания из первого сообщения.
Весьма трудно вести аргументированную беседу, когда приходится сравнивать ваш фреймворк, который ни пощупать не получается, ни документации его нету.
То есть вы можете написать много кода "под свой фреймворк", сказать, какой он удобный, и я могу только поверить вам на слово, и уж тем более не смогу приудмать случай на котором ваш фреймворк будет неудобен.
При этом сам фреймворк может даже и не существовать =)

Так что давайте уже ссылку на него.
На документацию тоже давайте, если есть. Если нету - не беда.
Ответить с цитированием
  #10 (permalink)  
Старый 17.10.2011, 16:59
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

мм. интересно а как система узнает что аякс закончен? предполагаю что они переделали его под дефферед. и как обчно у jQ все через левое ухо.

фреймворк есть, но он пока в закрытом виде. как я буду уверен что все работает и многое сделано он выйдет в свет с полной документацией. все равно его не скроешь. можно поменять семантику кода но логику все равно не скроешь.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новое окно с рисунком Vilmos Элементы интерфейса 2 24.06.2009 23:59