Присоединитесь к 2 'потокам' в JavaScript

У меня была та же проблема с запуском maven внутри IntelliJ, в то время как за прокси NTLM. Рабочее решение было следующим:

  1. Загрузите и установите CNTLM. Отличный пост здесь о том, как это сделать https://stackoverflow.com/a/23962313/3298801
  2. Установите и проверьте свои локальные настройки прокси в IntelliJ через Настройки >> Системные настройки >> HTTP-прокси.
  3. В Intellij установите бегуна Maven. В настройках >> Maven >> бегун установил параметры виртуальной машины:
    -DproxySet=true -DproxyHost=localhost -DproxyPort=3132
  4. Перезапустите Intellij
  5. Заметка в ~ / .m2 / settings.xml Я также добавил свой Конфигурация прокси как:

        
            true
            https
            localhost
            3132 
        

8
задан Paul Tarjan 30 May 2009 в 11:50
поделиться

4 ответа

Вы можете просто дать один и тот же обратный вызов как для вашего вызова 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.
    }
}
14
ответ дан 5 December 2019 в 06:54
поделиться

Решение Дэниела правильное. Я взял его и добавил дополнительный код, чтобы вам не приходилось слишком много думать;)

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);
4
ответ дан 5 December 2019 в 06:54
поделиться

Примерно так (схема):

registerThread() {
  counter++;
}

unregisterThread() {
  if (--counter == 0) fireEvent('some_user_event');
}

eventHandler_for_some_user_event() {
   do_stuff();
}
0
ответ дан 5 December 2019 в 06:54
поделиться

Наилучший подход к этому - воспользоваться преимуществом того факта, что функции являются объектами первого порядка в 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 никогда не будет выполнен до тех пор, пока основная часть кода, отправившего запрос, все равно не завершится, даже если это произойдет спустя много времени после получения ответа.

В случае, если это не ваша ситуация, я создал рабочий пример на моем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом ). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.

Если это не ваша ситуация, я создал рабочий пример на своем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом ). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.

Если это не ваша ситуация, я создал рабочий пример на своем сайте ; просмотрите исходный код, чтобы увидеть код (непосредственно перед тегом ). Он делает запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ на второй запрос обрабатывается одной функцией, а ответ на первый запрос позже обрабатывается другой функцией, поскольку запрос, который первым получил ответ, изменил переменную обратного вызова для ссылки на вторую функцию.

3
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: