Краткий ответ: ваш метод 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
.
ОК, я наконец нашел причину (благодаря кому-то в National Instruments), более эффективную диагностику и обходной путь.
Ошибка во многих версиях libxcb и является проблемой 32-разрядного опрокидывания счетчика который известен в течение нескольких лет: https://bugs.freedesktop.org/show_bug.cgi?id=71338
Не все версии libxcb затронуты libxcb-1.9 -5 имеет, libxcb-1.5-1 нет. Из списка ошибок 64-битная ОС не должна быть затронута, но мне удалось запустить ее хотя бы на одну версию.
Это приводит меня к лучшей диагностике. Следующая программа выйдет из строя менее чем за 15 минут в затронутых библиотеках (лучше, чем за всю неделю, которую она ранее взяла):
// Compile with: gcc test.c -lX11 && time ./a.out
#include <X11/Xlib.h>
void main(void) {
Display *d = XOpenDisplay(NULL);
if (d)
for(;;)
XNoOp(d);
}
И одна последняя вещь, вышеупомянутая прога скомпилирована и работает на 64-битной система отлично работает, скомпилирована и работает на старой 32-битной системе, также отлично работает, но если я перенесу 32-разрядную версию в 64-битную систему, она сработает через несколько минут.
У меня просто была программа, которая действовала точно так же, с точно таким же сообщением об ошибке. Я ожидал, что ошибка счетчика обработает события 2 ^ 32 до сбоя.
Программа была структурирована так, что рабочий поток имеет отдельное X-соединение с потоком X, чтобы он мог отправлять сообщения в поток X чтобы обновить окно.
В конце я проследил проблему до места, где функция, отправляющая события в окно, чтобы перерисовать ее, вызывалась несколькими потоками без мьютекса на ней, а так как X к тому же X-соединению не является повторным, сбой этой точной ошибки. Помещенный мьютекс на функцию и никаких проблем с тех пор.