Comments 114
А Вы слышали о Reactive Extensions for JS?
+2
Парсер съедает буковку «с» в ссылке.
Вот прямая
channel9.msdn.com/blogs/charles/introducing-rxjs-reactive-extensions-for-javascript
Вот прямая
channel9.msdn.com/blogs/charles/introducing-rxjs-reactive-extensions-for-javascript
0
Вы хоть бы писали в одной ветке, через пару десятков сообщений, расстояние между вашими комментариями увеличится и смысловая связь между ними ослабнет
0
Очень сложно это сделать — описания нет, а нечто напоминающее видео хочет плагин от MS.
0
Вот конкретный пример работы с этой библиотекой
blogs.msdn.com/b/jeffva/archive/2010/03/17/reactive-extensions-for-javascript-the-time-flies-like-an-arrow-sample.aspx
blogs.msdn.com/b/jeffva/archive/2010/03/17/reactive-extensions-for-javascript-the-time-flies-like-an-arrow-sample.aspx
0
Ну а тут описание задачи, схожей с темой топика
codebetter.com/blogs/matthew.podwysocki/archive/2010/05/10/introduction-to-the-reactive-extensions-for-javascript-async-method-chaining.aspx
codebetter.com/blogs/matthew.podwysocki/archive/2010/05/10/introduction-to-the-reactive-extensions-for-javascript-async-method-chaining.aspx
0
Что мешает поставить Silverlight или Moonlight?
-5
Я тут пытаюсь Flash снести нафиг. Зачем мне еще одно дырявое тормозилово?
+3
Flash я у себя снес, а вот Silverlight оставил — потому что конференции через него смотрю.
А у MS шикарно реализовано передача потокового видео. Он определяет возможности твоего канала и передает видео в том качестве, которое ты можешь принимать, что бы поток не приходилось буферезировать.
html5 такого не даст.
А у MS шикарно реализовано передача потокового видео. Он определяет возможности твоего канала и передает видео в том качестве, которое ты можешь принимать, что бы поток не приходилось буферезировать.
html5 такого не даст.
-4
> html5 такого не даст.
а это и не задача html5. это задача реализации видео в html5.
а это и не задача html5. это задача реализации видео в html5.
-1
в каждом конкретном браузере, есличо.
0
Эм, как это вообще решит это реализация html5?
MS предоставляет решение не только с плагином на клиенте, но и с распределенным ПО на серверах…
и есличо, это не задача реализации видео в html5
MS предоставляет решение не только с плагином на клиенте, но и с распределенным ПО на серверах…
и есличо, это не задача реализации видео в html5
0
а как быть если у человека другая платформа?
0
Какая разница, какая у него платформа? Вы используете клиентскую часть, а она есть под linux, windows, mac os.
Трафик гонится через ближайший для вас медиа-сервер со качеством, которое будет меняться плавно так, что бы вы просматривали потоковое видео без буферизирования.
Например недавняя PDC 2010 использовала это решение. О том, что я пропустил хоть секунды конференции работая через wifi и двигаясь по офисному здания не было и речи. (тут я намекаю, что качество wifi сигнала скакало)
p.s.
привет торрлям которые засрали карму
Трафик гонится через ближайший для вас медиа-сервер со качеством, которое будет меняться плавно так, что бы вы просматривали потоковое видео без буферизирования.
Например недавняя PDC 2010 использовала это решение. О том, что я пропустил хоть секунды конференции работая через wifi и двигаясь по офисному здания не было и речи. (тут я намекаю, что качество wifi сигнала скакало)
p.s.
привет торрлям которые засрали карму
0
Кирил, карму твою я не засырал, хотя бы по тому, что сам ее не имею. По теме, html 5 лучшее решение данной проблемы.
0
Ну, я не конкретно вам это написал.
HTML5 тут вообще не при чем.
Какая бы не была реализация тега video — это не поможет, т.к. отдачей потока(контента) занимается серверная часть.
В данном дереве комментариев, я лишь хотел показать, почему я оставляю silverlight(moonlight) в браузере у себя, falsh — как удаляю.
Но в связи с тем, что увы, на хабре много… эм… людей, которые вскормлены маркетингом — даже не стараются понять о чем идет речь, а сразу лезут в карму и опускают её.
HTML5 тут вообще не при чем.
Какая бы не была реализация тега video — это не поможет, т.к. отдачей потока(контента) занимается серверная часть.
В данном дереве комментариев, я лишь хотел показать, почему я оставляю silverlight(moonlight) в браузере у себя, falsh — как удаляю.
Но в связи с тем, что увы, на хабре много… эм… людей, которые вскормлены маркетингом — даже не стараются понять о чем идет речь, а сразу лезут в карму и опускают её.
0
Данное решение некрасиво на больших количествах колбеков, не лучше ли каунтить сделанный запрос, а при получении колбека каунт декрементировать? Каунт = 0 — тот самый момент. В этом случае не нужно именовать и перечислять колбеки.
+9
Не получится ли так, что не все еще запросы посланы, а предыдущие уже закончились и каунт равен 0?
0
Это немного другая задача. Разница в том решение топик стартера устойчиво к повторениям событий, а ваше — нет.
0
Да нет, в сабже ясно написано:
То бишь задача — выполнить определенный колбек, как только получены результаты всех запросов, отправленных асинхронно.
Нам надо отправить два асинхронных запроса и обработать их результат только после того, как будет получен результат обоих… Но особенность асинхронных запросов в том, что мы не знаем, какой из них придёт первым
То бишь задача — выполнить определенный колбек, как только получены результаты всех запросов, отправленных асинхронно.
0
И что запросы не могут придти дважды?
0
И что запросы не могут придти дважды?
Не совсем понял смысл вопроса. На один запрос — один колбек. Вы таки про колбеки спрашиваете, или про запросы?
0
Что не бывает случаев когда событие на которое вешается колбэк случается несколько раз, и соответственно колбэк вызывается не один раз а несколько?
0
Приведите пример, о каких таких случаях вы говорите?
+1
да блин, банально два триггера — один от нажатия мышки на кнопку, второй от клавы на… пусть будет Ctrl.
Но вообще мне надавно пришлось делать перезапросы ajax-ом на сервера потому что там было несколько десятков событий, которые агрегировались в общий запрос на каждый сервер, но нужно было в конце концов получить все.
Но вообще мне надавно пришлось делать перезапросы ajax-ом на сервера потому что там было несколько десятков событий, которые агрегировались в общий запрос на каждый сервер, но нужно было в конце концов получить все.
0
да блин, банально два триггера — один от нажатия мышки на кнопку, второй от клавы на… пусть будет Ctrl.
Сабж про ajax запросы, а не обработку событий dom.
Но вообще мне надавно пришлось делать перезапросы ajax-ом на сервера потому что там было несколько десятков событий, которые агрегировались в общий запрос на каждый сервер, но нужно было в конце концов получить все.
Это частная задача, и решение её будет частным.
+1
periodicalUpdater любой.
0
сабжевый способ эту проблему не решает.
-1
в данном решении именование колбеков еще влияет на имена аргументов. А как Вы будете запоминать результаты?
0
и каждый раз при добавлении нового запроса, будем исправлять два значения count? тоже не сильно красиво. чтото мне подсказывает, что весь сыр бор здесь ни к чему не приведёт. имхо, нет изящного решения, которое бы устраняло эту проблему. проблема лежит немного глубже — в природе асинхронных запросов, они — асинхронны, а соответственно, мы не должны знать, какой из них придёт первым(по задумке создателей), а всё что мы выдумываем для этого — велосипед…
0
изначально я тоже думал сделать на основе каунтера
Но вынес именно те недостатки, что назвал Wott:
1. Повторение
Допустим, мы можем ждать повторяющегося события, нажатие кнопок A, B. Тогда пользователь может дважды нажать кнопку A и событие сработает
Другой вариант — если пользователь нажал «ентер» и данные уже скачаны аджаксом — должна начатся обработка данных.
Очевидно, он может дважды нажать ентер, а данные еще не скачены.
На самом деле ситация редкая, но почему бы её не предвидеть, учитывая, что есть еще недостатки
2. Аргументы
Как в этом примере узнать, где ответ от какой функции? args[0] — это ответ asyncFsAccess или asyncDbAccess?
3. Читабельность
Со мной, конечно, могут поспорить, но я считаю, что понятнее вторая строка:
var process = processFsAndDb.after(2);
asyncFsAccess( file, process);
asyncDbAccess(query, process);
Но вынес именно те недостатки, что назвал Wott:
1. Повторение
Допустим, мы можем ждать повторяющегося события, нажатие кнопок A, B. Тогда пользователь может дважды нажать кнопку A и событие сработает
var process = processFsAndDb.after(2);
onKeyDown('A', process);
onKeyDown('B', process);
Другой вариант — если пользователь нажал «ентер» и данные уже скачаны аджаксом — должна начатся обработка данных.
var process = processFsAndDb.after(2);
onKeyDown('enter', process);
ajax(url, process);
Очевидно, он может дважды нажать ентер, а данные еще не скачены.
На самом деле ситация редкая, но почему бы её не предвидеть, учитывая, что есть еще недостатки
2. Аргументы
Как в этом примере узнать, где ответ от какой функции? args[0] — это ответ asyncFsAccess или asyncDbAccess?
var process = processFsAndDb.after(2);
asyncFsAccess( file, process);
asyncDbAccess(query, process);
3. Читабельность
Со мной, конечно, могут поспорить, но я считаю, что понятнее вторая строка:
var process = processFsAndDb.after(2);
var process = processFsAndDb.after('keyPressed', 'ajaxComplete');
+1
К сожалению вся красота пропадет если добавить еще валидацию принятых данных…
А так ничего — прикольно.
А так ничего — прикольно.
+1
валидация в
processFsAndDb
, не?0
можно и так, но ведь можно же в нем и проверять наличие всех данных, а не делать для этого отдельную обертку :)
смысл в том что бы разделять разные процессы ( это еще хорошо для обработки ошибок ). Именно этим мне и понравилось Ваше решение.
Я тут выше описал ситуацию когда полученный запрос неплохо бы перезапросить, прежде чем проверять наличие остальных данных. И уже по готовности и валидности всех данных — обрабатывать. В общем мухи — отдельно, котлеты — отдельно.
смысл в том что бы разделять разные процессы ( это еще хорошо для обработки ошибок ). Именно этим мне и понравилось Ваше решение.
Я тут выше описал ситуацию когда полученный запрос неплохо бы перезапросить, прежде чем проверять наличие остальных данных. И уже по готовности и валидности всех данных — обрабатывать. В общем мухи — отдельно, котлеты — отдельно.
0
Раз пошла такая пьянка, то думаю стоит упомянуть про Deferred. Выглядело бы примерно так
По поводу Function.prototype.after — мне кажется что после выполнения onReady стоит очищать хеши after и ready.
var fileData;
var dbData;
next(function(){
return asyncFsAccess(file).next(function(data){fileData = data})
}).
next(function()
return asyncDbAccess(query).next(function(data){dbData = data})
}).
next(function(){
return processFsAndDb(fileData, dbData)
})
По поводу Function.prototype.after — мне кажется что после выполнения onReady стоит очищать хеши after и ready.
+1
Чем этот вариант отличается от варианта автора под названием «Фиг с ним, подожду»?
0
Как минимум тем что вместо каллбеков цепочки, т.е. код становится более читабельным. Плюс значительно упрощается отлов ошибок через метод .error
...
next(function(){
return asyncFsAccess(file).next(function(data){fileData = data})
}).
error(function(e){
console.log(e)
})
...
+1
Только этим и отличается, но сам принцип лучше не становится.
0
Как по мне — разница значительна. Если вы намекаете на параллельность запросов — то делается это так:
parallel([
asyncFsAccess(file),
asyncDbAccess(query)
]).
error(function(e){
console.log(e)
}).
next(function (results) {
processFsAndDb.apply(this, results)
});
+4
В вашем примере asyncFsAccess и asyncDbAccess вызовутся синхронно.
0
по-первых, ваша ссылка отвечает мне «Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.»
во-вторых, посмотрите внимательно, что вы написали. asyncFsAccess — это функция, которую вы вызываете, а не передаёте параметром в parallel. то есть в parallel передастся не нужная нам функция, а результат её выполнения.
решение — поступить, как tenshi — биндить аргумент к функции, если вы расширили прототип ф-ции и у вас есть такой метод.
во-вторых, посмотрите внимательно, что вы написали. asyncFsAccess — это функция, которую вы вызываете, а не передаёте параметром в parallel. то есть в parallel передастся не нужная нам функция, а результат её выполнения.
решение — поступить, как tenshi — биндить аргумент к функции, если вы расширили прототип ф-ции и у вас есть такой метод.
0
Надеюсь такая ссылка у вас откроется
https://github.com/cho45/jsdeferred/blob/master/jsdeferred.js#L406
https://github.com/cho45/jsdeferred/blob/master/jsdeferred.js#L406
0
открылась. и я прекрасно понимаю, что это значит. но внимательно почитайте моё предыдущее сообщения.
0
вместо биндения аргументов в deferred используется «самовызов» из callback'a, т.е. как-то так:
parallel([
(function(){
var d = Deferred();
setTimeout(function () {
d.call('value1');
}, 100);
return d;
})(),
(function(){
var d = Deferred();
setTimeout(function () {
d.call('value2');
}, 100);
return d;
})()
]).
next(function (results) {
console.log(results);
})
0
ну… не очень красиво…
0
смотря как его готовить. можно один раз всунуть deferred, например, в свою AJAX функцию
0
function http_get(url) {
var d = Deferred();
var xhr = new XmlHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;
if (xhr.status==200){
d.call(xhr.responseText);
} else {
d.fail(xhr.statusText);
}
}
xhr.send(null);
return d;
}
а дальше вполне красиво себе использовать
0
Есть замечательная библиотека Step. С помощью нее ваш код будет выглядит так:
Удобнее, не находите?
- Step(
- function() {
- asyncFsAccess(file, this.parallel());
- asyncDbAccess(query, this.parallel());
- },
- function(err, fileData, dbData) {
- processFsAndDb(fileData, dbData);
- }
- );
* This source code was highlighted with Source Code Highlighter.
Удобнее, не находите?
+3
ИМХО, если не критична скорость, то лучше воспользоваться надежным вариантом… С последовательными вызовами…
В ExtJS Ext.Direct, параллельные асинхронные запросы, при условии что вызываются в определенном интервале времени, отрабатываются на самом деле одним запросом, реализация конечно сокрыта в недрах библиотеки.
В ExtJS Ext.Direct, параллельные асинхронные запросы, при условии что вызываются в определенном интервале времени, отрабатываются на самом деле одним запросом, реализация конечно сокрыта в недрах библиотеки.
0
шаманство какое-то.
лучше так:
Sync()
.thread( asyncFsAccess.bind( file ) )
.thread( asyncDbAccess.bind( query ) )
.finalizer( processFsAndDb )
.run()
asyncFsAccess( file, process['fs']);
asyncDbAccess(query, process['db']);
лучше так:
Sync()
.thread( asyncFsAccess.bind( file ) )
.thread( asyncDbAccess.bind( query ) )
.finalizer( processFsAndDb )
.run()
asyncFsAccess( file, process['fs']);
asyncDbAccess(query, process['db']);
0
Async.js умеет. В браузере и на сервере. По цепочке, параллельно, водопадом (когда результат одной асинхронной функции передается на вход следующей) и много еще чего. Для меня лично — самый понятный вариант среди всех async и combo библиотек и подходов. Использую на нескольких проектах, пока не подводил.
+4
Уже с год для программирования сложных анимированных интерфейсов пользую свой простенький класс AfterAll.
Интерфейс:
var after = new AfterAll;
after.addAfterAllCB(function(){$('#screen').hide();});
$('#bar').animate({top: 30}, 1000, after.getCB(function(){$(this).hide()}));
$('#ov').fadeOut(100, after.getCB());
тобишь можно еще калбеки для каждого отдельного действия добавлять.
Интерфейс:
var after = new AfterAll;
after.addAfterAllCB(function(){$('#screen').hide();});
$('#bar').animate({top: 30}, 1000, after.getCB(function(){$(this).hide()}));
$('#ov').fadeOut(100, after.getCB());
тобишь можно еще калбеки для каждого отдельного действия добавлять.
0
Я думаю этот патч не будет принят из-за несовместимости с некоторыми браузерами.
0
Ок, а если так? jQuery.one тут только чтобы код был короче
function EventCollector(cb, manyTimes) {
var q = 0;
this.add = function( target, evt ){
++q;
$(target).one(evt, function( evt ){
if( --q < 1 ) {
cb();
}
});
return this;
};
};
var Obj = new (function(){
var self = this;
this.async = function() {
setTimeout(function(){
$(self).triggerHandler('async');
}, 1000);
};
})();
var evc = new EventCollector(function(){
alert('all done');
});
evc.add('button', 'click');
evc.add(Obj, 'async');
Obj.async();
0
простите, не совсем понял ваше предложение.
можете пояснить на примере?
можете пояснить на примере?
0
Я предлагаю использовать события а не коллбеки.
т.е. это могут быть и нативные события, но в примере я использовал жкверевскую модель.
Это простенький класс с каунтером, который вешает события на объекты, а потом ждёт их все. Вызовом СВОИХ событий занимается каждый объект сам.
Чуть упростил, может так лучше:
т.е. это могут быть и нативные события, но в примере я использовал жкверевскую модель.
Это простенький класс с каунтером, который вешает события на объекты, а потом ждёт их все. Вызовом СВОИХ событий занимается каждый объект сам.
Чуть упростил, может так лучше:
function EventCollector(cb, delay) {
var q = 0;
function evtDone(){
if( --q < 1 ) {
cb();
}
}
this.one = function( target, evt ){
++q;
$(target).one(evt, evtDone);
return this;
};
this.delay = function( time ){
++q;
setTimeout(evtDone, time);
return this;
};
};
var evc = new EventCollector(function(){
alert('all done');
});
evc.one('button', 'click').delay( 1000 );
0
UFO just landed and posted this here
Как вариант сделать «стек» запросов, который при инициализации заполняется нужными запросами, после чего происходит их асинхронный запуск, после того как на любой из запрос вернулся результат, удалить этот запрос из стека, а после того как стек опустеет вызвать колбек…
0
Самый верный способ — положить на backend скрипт, который может менять в цикле $_POST / $_SERVER['REQUEST_URI'] (если это PHP) и делать нужный include().
А далее всё просто:
бонус: не дёргаем лишний раз сервер
А далее всё просто:
queue = new $.queue('id1', '/test/_f1', {'a' : 11});
queue.add('id2', '/test/_f2', {'a' : 12});
queue.add('id3', '/test/_f3', {'a' : 13});
queue.send(
function(data)
{
response1 = data.id1;
response2 = data.id2;
response3 = data.id3;
}
);
бонус: не дёргаем лишний раз сервер
0
В варианте «7 раз проверь ++» нет вызова функции process(), лучше поправить.
0
UFO just landed and posted this here
А у когото было такое?
TypeError: asyncAbAccess(...) is not a function
хотя весь код данных функций как в примере исполняеят но по окончании ошибка и все дальше код не идет +(
TypeError: asyncAbAccess(...) is not a function
хотя весь код данных функций как в примере исполняеят но по окончании ошибка и все дальше код не идет +(
0
asyncDbAccess
0
суть не в том — я просто поменял букву, суть в тому что после объявления «процесс»
var process = processFsAndDb.after('fs', 'db', "ab");
ни 1 функция уже не работает — точнее так: function zxc(a){console.log(a)}; zxc(2)
TypeError: zxc(...) is not a function
0
Напишите весь код, пожалуйста)
0
function asyncFsAccess(a, c){
console.log(a)
if (c) c()
};
function asyncDbAccess(b, c){
console.log(b)
if (c) c()
};
processFsAndDb = function(){
console.log("done",arguments);
}
function asd(a){
console.log(a)
//if (c) c()
};
function zxc(a){log(a)}
asd(3)
var process = processFsAndDb.after('fs', 'db', "ab");
//asyncFsAccess( 1, process.fs)
//asyncDbAccess( 2, process.db)
zxc(2)
0
упс
0
Sign up to leave a comment.
После всех асинхронных вызовов