Вы просто должны отслеживать, либо счетчик, либо (мой предпочтительный подход) флаги для всей соответствующей информации.
var slideDone, getDone;
$("#foo").slideUp(function() {
slideDone = true;
nextThing();
});
$.get({
// ...
success: function() {
getDone = true;
nextThing();
}
});
function nextThing() {
if (slideDone && getDone) {
// Do the next thing
}
}
Теперь, очевидно, мои два условия выше очень искусственные, но я считаю, что большинствовремени, когда это происходит в моей реальной работе, у меня есть фактическая информация, которую я могу использовать для проверки, и поэтому не прибегаю к искусственным условиям.
Или счетчик:
var counter = 0;
++counter;
$("#foo").slideUp(function() {
nextThing();
});
++counter;
$.get({
// ...
success: function() {
nextThing();
}
});
function nextThing() {
if (--counter === 0) {
// Do the next thing
}
}
Для кого-то, привыкшего к многопоточному программированию, это выглядит как состояние гонки (что если slideUp
завершится до того, как мы запустим get
?), Но это не то, что в JavaScript в браузерах, чтоявляется однопоточным (за исключением использования веб-работников , которые используют синтаксис, который в любом случае не будет применяться к вышеперечисленному).
Если вы обнаружите, что это часто встречается, вы могли быконечно, всегда изолировать логику (не то, что есть много ее, но ...) в объекте и использовать ее повторно.