Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
См. превосходное сообщение в блоге Эрика Липперта по этой проблеме.
Это вызвано доступом к «измененному закрытию» .
Измените тело вашего цикла на это:
for (int i = 1; i<=3; i++)
{
int j = i; // Prevent use of modified closure.
Thread thread = new Thread(() => testThread("" + j + "__"));
thread.Start();
}
(Обратите внимание, что для цикла foreach
это было исправлено в .Net 4.5, но оно НЕ было исправлено для цикла for
.)
testThread
не вызывается при создании объектов Thread
в цикле for - метод вызывается всякий раз, когда запускается поток. И это может произойти позже.
В вашем случае потоки начали работать после завершения цикла for - к тому времени i
было равно 3. Таким образом, testThread
вызывается 3 раза со значением 3
.
Закрытие. Вы должны в значительной степени скопировать переменную в потоке, чтобы она сохраняла текущее значение.
Уайт теперь все потоки читают переменную i с любым значением, которое они имеют в момент их запуска - НЕ со значением it когда было вызвано thread.start.