Try # 1: He aquí una solución que no requiere variables globales adicionales:
request1.onComplete = function() {
// register new handler for event2 here, overwriting the old one
request2.onComplete = function() {
// now they're both done
}
}
request2.onComplete = function() {
// register new handler for event1 here, overwriting the old one
request1.onComplete = function() {
// now they're both done
}
}
El controlador para el que sea activa el evento de primera borrará de edad manejador del otro y asignar una nueva que incluye la cosas que debe hacer después de la finalización de ambos eventos. Debido a que reasignamos el segundo controlador dentro del controlador del primer evento (cualquiera que sea), siempre sabemos que terminamos cuando el segundo controlador finaliza.
Try # 2: Aquí hay algo que va a funcionar si cada tipo de evento es diferente:
function onBoth(fn) {
var last, done = false;
return function(e) {
if (last && last !== e.type && !done) {
fn(); // done
done = true;
}
last = e.type;
}
}
Por ejemplo, esto no le alertará "hecho" cuando el usuario haya tanto desplazado clic:
var both = onBoth(function() {
alert("done")
});
document.addEventListener("scroll", both, false);
document.addEventListener("click", both, false);
try # 3: El intento anterior puede ser modificado para trabajar por eventos similares:
function onBoth(fn) {
var last, done = false;
return function(curr) {
if (last && last !== curr && !done) {
fn(); // done
done = true;
}
last = curr;
}
}
... que debe ser utilizado de esta manera:
var check = onBoth(function() {
alert("done")
});
request1.onComplete = function() {
check(arguments.callee);
}
request2.onComplete = function() {
check(arguments.callee);
}
Básicamente, se comprueba que dos devoluciones de llamada diferentes han ejecutado mediante el almacenamiento de una referencia a la llamada más recientemente ejecutado espalda. Su uso es un poco torpe, pero hace el trabajo (es decir, seguirá funcionando si cada uno de los eventos se ejecuta más de una vez).
¿Está esperando que estos eventos ocurran en un orden en particular? Eso afecta la solución en gran medida. –
No, cualquier orden posible – Evert