У меня была та же проблема с запуском maven внутри IntelliJ, в то время как за прокси NTLM. Рабочее решение было следующим:
-DproxySet=true -DproxyHost=localhost -DproxyPort=3132
true
https
localhost
3132
Вы можете просто дать один и тот же обратный вызов как для вашего вызова AJAX, так и для другого выполняемого кода, использовать переменную для отслеживания их общего прогресса, а затем связать их с обратным вызовом, как показано ниже:
// Each time you start a call, increment this by one
var counter = 0;
var callback = function() {
counter--;
if (counter == 0) {
// Execute code you wanted to do once both threads are finished.
}
}
Решение Дэниела правильное. Я взял его и добавил дополнительный код, чтобы вам не приходилось слишком много думать;)
function createNotifier() {
var counter = 2;
return function() {
if (--counter == 0) {
// do stuff
}
};
}
var notify = createNotifier();
var later = function() {
var done = false;
// do stuff and set done to true if you're done
if (done) {
notify();
}
};
function doAjaxCall(notify) {
var ajaxCallback = function() {
// Respond to the AJAX callback here
// Notify that the Ajax callback is done
notify();
};
// Here you perform the AJAX call action
}
setInterval(later, 200);
doAjaxCall(notify);
Примерно так (схема):
registerThread() {
counter++;
}
unregisterThread() {
if (--counter == 0) fireEvent('some_user_event');
}
eventHandler_for_some_user_event() {
do_stuff();
}
Наилучший подход к этому - воспользоваться преимуществом того факта, что функции являются объектами первого порядка в JavaScript. Поэтому вы можете назначить их переменным и вызывать их через переменную, изменяя функцию, на которую ссылается переменная, по мере необходимости.
Например:
function firstCallback() {
// the first thing has happened
// so when the next thing happens, we want to do stuff
callback = secondCallback;
}
function secondCallback() {
// do stuff now both things have happened
}
var callback = firstCallback;
Если оба ваших фрагмента кода теперь используют переменную для вызова функции:
callback();
, то, какой из них будет выполнен первым, вызовет firstCallback, который изменяет переменную так, чтобы она указывала на secondCallback, и поэтому он будет вызываться тем, что выполняется вторым.
Однако ваша формулировка вопроса подразумевает, что все это может быть ненужным, поскольку это звучит так, как будто вы делаете запрос Ajax, а затем продолжаете обработку. Поскольку интерпретаторы JavaScript являются однопоточными, обратный вызов Ajax никогда не будет выполнен до тех пор, пока основная часть кода, отправившего запрос, все равно не завершится, даже если это произойдет спустя много времени после получения ответа.
В случае, если это не ваша ситуация, я создал рабочий пример на моем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом
). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.
Если это не ваша ситуация, я создал рабочий пример на своем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом ). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.
Если это не ваша ситуация, я создал рабочий пример на своем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом ). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.