Краткий ответ: ваш метод 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
.
Вы ищете any()
:
if any('apple' in code for code in CODES):
...
В сочетании с простым выражением генератора это делает задачу. Выражение генератора принимает каждый кортеж и дает True
, если оно содержит 'apple'
. any()
затем возвращает True
, когда первый элемент, который он запрашивает, возвращает True
(в противном случае False
). Следовательно, это делает то, что вы хотите. Он также хорошо читается - , если какой-либо из кортежей содержит 'apple'
.
Если вы делаете это много раз и нуждаетесь в производительности, то, возможно, стоит сделать набор всех значений, позволяющих сделать это очень быстро:
cache = set(itertools.chain.from_iterable(CODES)))
Естественно, что построение этого будет медленным и использовать память, поэтому было бы неплохо, если вам не понадобится много производительности и будет выполнять много проверок членства.
Вы можете использовать itertools.chain()
:
Использование его с in
приведет к короткому замыканию, аналогичному any()
.
In [30]: CODES = (
....: ('apple', 'reddelicious'),
....: ('caramel', 'sweetsticky'),
....: ('banana', 'yellowfruit'),
....: )
In [31]: from itertools import chain
In [32]: 'apple' in chain(*CODES)
Out[32]: True
In [33]: 'foo' in chain(*CODES)
Out[33]: False
Для сравнения производительности вы можете проверить мой другой ответ .