Попробуйте # 1 : вот решение, которое не требует дополнительных глобальных переменных:
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
}
}
Обработчик, который запускает событие первым, очистит старый обработчик другого и назначитновый, который включает в себя то, что вам нужно сделать после завершения обоих событий.Поскольку мы переопределяем второй обработчик внутри обработчика первого события (в зависимости от того, что это), мы всегда знаем, что мы закончили, когда этот второй обработчик завершится.
Try # 2 :Вот что будет работать, если каждый тип события будет отличаться:
function onBoth(fn) {
var last, done = false;
return function(e) {
if (last && last !== e.type && !done) {
fn(); // done
done = true;
}
last = e.type;
}
}
Например, это не будет предупреждать "сделано", пока пользователь не прокрутил и не нажал:
var both = onBoth(function() {
alert("done")
});
document.addEventListener("scroll", both, false);
document.addEventListener("click", both, false);
Try # 3 : предыдущая попытка может быть изменена для работы с подобными событиями:
function onBoth(fn) {
var last, done = false;
return function(curr) {
if (last && last !== curr && !done) {
fn(); // done
done = true;
}
last = curr;
}
}
... которая должна использоваться следующим образом:
var check = onBoth(function() {
alert("done")
});
request1.onComplete = function() {
check(arguments.callee);
}
request2.onComplete = function() {
check(arguments.callee);
}
По сути, это проверяет выполнение двух разных обратных вызовов, сохраняя ссылку на последний выполненный обратный вызов.Его использование немного неуклюже, но оно выполняет свою работу (то есть все равно будет работать, если каждое из событий будет выполнено более одного раза).