Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Новое поколение цепочек - ассинхронность (https://javascript.ru/forum/misc/22366-novoe-pokolenie-cepochek-assinkhronnost.html)

PeaceCoder 17.10.2011 00:25

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

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 можно писать ассинхронно!

Gvozd 17.10.2011 01:20

Цитата:

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

Спасибо, поржал.

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

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

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

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

3)Я не нашел в вашем примере асинхронности
Все пользовательские функции в вашем примере - синхронные
Может покажите, как в вашем фреймворке будет выглядеть набор из 3х последовательны AJAX запросов?
Ну или что-нибудь другое асинхронное?

PeaceCoder 17.10.2011 01:36

Цитата:

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

именно. они синхронно выполняются но задавать их можно ассинхронно.

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


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

Gvozd 17.10.2011 01:59

Цитата:

Сообщение от PeaceCoder
именно. они синхронно выполняются но задавать их можно ассинхронно.

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

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


В общем, я правильно понял, что ваш фреймворк - это возможность задавать очередь функций, каждая из которых бы выполнилась бы в свою очередь, по порядку?
Чем ваша концепция лучше Deferred?

PeaceCoder 17.10.2011 02:10

Цитата:

Сообщение от 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

Riim 17.10.2011 04:47

Цитата:

Сообщение от PeaceCoder
А отличие от Deffered? А я так и не понял что они там намутили.

Упрощенный Deferred.

Gvozd 17.10.2011 04:53

Цитата:

Сообщение от 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]


Gvozd 17.10.2011 04:53

Цитата:

Сообщение от 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)

Gvozd 17.10.2011 04:54

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

Так что давайте уже ссылку на него.
На документацию тоже давайте, если есть. Если нету - не беда.

PeaceCoder 17.10.2011 16:59

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

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


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