Краткий ответ: ваш метод 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
.
Это не ошибка компилятора, и эта проблема не связана с вашим использованием дженериков. И First
, и Last
являются функциями, поэтому компилятор не может сказать, хотите ли вы их назвать или ссылаться на них. Будьте ясны и дайте компилятору понять, что вы хотите вызвать функцию, поставив парсеры.
aProc := ProcList.First();
aProc := ProcList.Last();
Еще раз вы были пойманы решением разрешить игнорировать парс при вызове процедур и функций , Это дизайнерское решение, в то время как выглядело так привлекательно, когда оно было сделано, выглядит менее так, что процедурные типы настолько широко используются в современных стилях кодирования.
Когда вы пишете ProcList.First
, компилятор сталкивается с двусмысленностью. Вы хотите назвать функцию, или хотите ли вы обратиться к функции как процедурный? Во многих сценариях компилятор не может разрешить двусмысленность, но здесь это не так, где выражение найдено в правой части оператора присваивания. Столкнувшись с этой неоднозначностью, компилятор предполагает, что вы имеете в виду ссылку на функцию.
Он принимает этот выбор, потому что другой выбор будет хуже. По крайней мере, таким образом вы можете предоставить parens и явно указать, что вы имеете в виду функцию вызываемой функции. Если бы компилятор пошел другим путем, тогда вам оставалось искать способ сказать, что вы хотели бы обратиться к функции.
В качестве окончательного в стороне, если First
и Last
были реализованы как свойства, не было бы никакой двусмысленности.