Краткий ответ: ваш метод 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
.
Возможно, это помогает, начиная с C99, 7.1.3 («Зарезервированные идентификаторы»):
blockquote>
- Все идентификаторы, начинающиеся с подчеркивания, и буква верхнего регистра или другое подчеркивание всегда зарезервировано для любого использования.
- Все идентификаторы, начинающиеся с символа подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью файлов как в обычном, так и в пространстве имен тегов.
Мораль: для обычного кода пользователя, вероятно, лучше не начинать идентификаторы с подчеркиванием.
(В соответствующей заметке, я думаю, вам также следует избегать именования типов с конечным
_t
, который зарезервирован для стандартных типов.)
Это трюк, используемый в файлах заголовков реализаций C для глобальных символов, чтобы предотвратить возможные конфликты с другими символами, определенными пользователем.
Поскольку C не имеет функции пространства имен, это рудиментарный подход, чтобы избежать конфликтов имен с пользователем.
Объявление таких символов в вашем собственном заголовке и исходных файлах не рекомендуется, поскольку оно может вводить конфликты имен между вашим кодом и реализацией C. Даже если это не создает конфликт в вашей текущей реализации, вы по-прежнему склонны к странным конфликтам в разных / будущих реализациях, поскольку они могут использовать другие символы с префиксом с подчеркиванием.
независимо от того, является ли его C или нет, ведущее подчеркивание предоставляет программисту индикацию состояния, поэтому ему не нужно искать его. В PHP или любом объектно-ориентированном языке, где мы имеем дело с десятками тысяч свойств и методов, написанных тысячами авторов, видя, что префикс подчёркивания устраняет необходимость проскальзывать через класс и оценивать, является ли его объявленным приватным или защищенным или общедоступным. Это огромная экономия времени. практика началась до C, я уверен ...