17.10.2011, 00:25
|
|
Профессор
|
|
Регистрация: 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.
|
|
17.10.2011, 01:20
|
|
Матрос
|
|
Регистрация: 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 запросов?
Ну или что-нибудь другое асинхронное?
|
|
17.10.2011, 01:36
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от Gvozd
|
Все пользовательские функции в вашем примере - синхронные
|
именно. они синхронно выполняются но задавать их можно ассинхронно.
$().sync().ajax(fn1).ajax(fn2).ajax(fn3)
При этом сам ajax ассинхронен, но их выполнение синхронно. В этом то и вся фишка будет. Можно задавать цепочку действий и не факт что она будет исполненна сразу. в каждом из звеньев может включится ассинхронность по времени, но исполнение все равно будет синхронно
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
17.10.2011, 01:59
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от PeaceCoder
|
именно. они синхронно выполняются но задавать их можно ассинхронно.
|
может все-таки наоборот?
в вашем втором примере, вы синхронно задали выполнение трех AJAX-, запросов и обработчиков к ним.
Или между выполнением .ajax(fn1) и .ajax(fn2) может быть выполнен еще какой-нибудь код?
а вот выполняется код уже асинхронно(я ж полагаю, между срабатыванием fn1 и срабатыванием fn2 браузер не зависает, и может быть выполнен другой код?), хотя и последовательно(опять-таки предположение).
К тому же фреймворки для асинхронности обычно пишутся для того чтобы можно было писать код в синхронном стиле, но выполнялся бы он асинхронно. Делать наоборот - просто бессмысленно и беспощадно.
В общем, я правильно понял, что ваш фреймворк - это возможность задавать очередь функций, каждая из которых бы выполнилась бы в свою очередь, по порядку?
Чем ваша концепция лучше Deferred?
|
|
17.10.2011, 02:10
|
|
Профессор
|
|
Регистрация: 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.
|
|
17.10.2011, 04:47
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от PeaceCoder
|
А отличие от Deffered? А я так и не понял что они там намутили.
|
Упрощенный Deferred.
|
|
17.10.2011, 04:53
|
|
Матрос
|
|
Регистрация: 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] |
|
|
17.10.2011, 04:53
|
|
Матрос
|
|
Регистрация: 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)
|
|
17.10.2011, 04:54
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
И вообще, вы очень ловко съехали, не отреагировав на мои первое и второе замечания из первого сообщения.
Весьма трудно вести аргументированную беседу, когда приходится сравнивать ваш фреймворк, который ни пощупать не получается, ни документации его нету.
То есть вы можете написать много кода "под свой фреймворк", сказать, какой он удобный, и я могу только поверить вам на слово, и уж тем более не смогу приудмать случай на котором ваш фреймворк будет неудобен.
При этом сам фреймворк может даже и не существовать =)
Так что давайте уже ссылку на него.
На документацию тоже давайте, если есть. Если нету - не беда.
|
|
17.10.2011, 16:59
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
мм. интересно а как система узнает что аякс закончен? предполагаю что они переделали его под дефферед. и как обчно у jQ все через левое ухо.
фреймворк есть, но он пока в закрытом виде. как я буду уверен что все работает и многое сделано он выйдет в свет с полной документацией. все равно его не скроешь. можно поменять семантику кода но логику все равно не скроешь.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Новое окно с рисунком |
Vilmos |
Элементы интерфейса |
2 |
24.06.2009 23:59 |
|
|
|