Встроенный анализатор выражений в Delphi D10 Сиэтл, неспособный оценить выражение при определенных условиях [дубликат]

Краткий ответ: ваш метод 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.

11
задан J... 1 October 2014 в 16:27
поделиться

1 ответ

Это не ошибка компилятора, и эта проблема не связана с вашим использованием дженериков. И First, и Last являются функциями, поэтому компилятор не может сказать, хотите ли вы их назвать или ссылаться на них. Будьте ясны и дайте компилятору понять, что вы хотите вызвать функцию, поставив парсеры.

aProc := ProcList.First();
aProc := ProcList.Last();

Еще раз вы были пойманы решением разрешить игнорировать парс при вызове процедур и функций , Это дизайнерское решение, в то время как выглядело так привлекательно, когда оно было сделано, выглядит менее так, что процедурные типы настолько широко используются в современных стилях кодирования.

Когда вы пишете ProcList.First, компилятор сталкивается с двусмысленностью. Вы хотите назвать функцию, или хотите ли вы обратиться к функции как процедурный? Во многих сценариях компилятор не может разрешить двусмысленность, но здесь это не так, где выражение найдено в правой части оператора присваивания. Столкнувшись с этой неоднозначностью, компилятор предполагает, что вы имеете в виду ссылку на функцию.

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

В качестве окончательного в стороне, если First и Last были реализованы как свойства, не было бы никакой двусмысленности.

13
ответ дан David Heffernan 31 August 2018 в 16:51
поделиться
Другие вопросы по тегам:

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