Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Нам надо отправить два асинхронных запроса и обработать их результат только после того, как будет получен результат обоих… Но особенность асинхронных запросов в том, что мы не знаем, какой из них придёт первым
И что запросы не могут придти дважды?
да блин, банально два триггера — один от нажатия мышки на кнопку, второй от клавы на… пусть будет Ctrl.
Но вообще мне надавно пришлось делать перезапросы ajax-ом на сервера потому что там было несколько десятков событий, которые агрегировались в общий запрос на каждый сервер, но нужно было в конце концов получить все.
var process = processFsAndDb.after(2);
asyncFsAccess( file, process);
asyncDbAccess(query, process);
var process = processFsAndDb.after(2);
onKeyDown('A', process);
onKeyDown('B', process);
var process = processFsAndDb.after(2);
onKeyDown('enter', process);
ajax(url, process);
var process = processFsAndDb.after(2);
asyncFsAccess( file, process);
asyncDbAccess(query, process);
var process = processFsAndDb.after(2);
var process = processFsAndDb.after('keyPressed', 'ajaxComplete');
processFsAndDb, не?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)
})
...
next(function(){
return asyncFsAccess(file).next(function(data){fileData = data})
}).
error(function(e){
console.log(e)
})
...parallel([
asyncFsAccess(file),
asyncDbAccess(query)
]).
error(function(e){
console.log(e)
}).
next(function (results) {
processFsAndDb.apply(this, results)
});
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);
})
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;
}
- 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.Sync()
.thread( asyncFsAccess.bind( file ) )
.thread( asyncDbAccess.bind( query ) )
.run( processFsAndDb );
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();
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 );
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;
}
);
var process = processFsAndDb.after('fs', 'db', "ab");
ни 1 функция уже не работает — точнее так: function zxc(a){console.log(a)}; zxc(2)
TypeError: zxc(...) is not a function
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)
После всех асинхронных вызовов