Краткий ответ: ваш метод 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
.
Вам нужно добавить 2 метода , отметить __hash__
и __eq__
:
class MyThing:
def __init__(self,name,location,length):
self.name = name
self.location = location
self.length = length
def __hash__(self):
return hash((self.name, self.location))
def __eq__(self, other):
return (self.name, self.location) == (other.name, other.location)
def __ne__(self, other):
# Not strictly necessary, but to avoid having both x==y and x!=y
# True at the same time
return not(self == other)
Документация Python dict определяет эти требования на ключевые объекты, т. е. они должны быть хешируемыми .
Вы переопределяете __hash__
, если хотите специальную хэш-семантику, и __cmp__
или __eq__
, чтобы сделать ваш класс пригодным для использования в качестве ключа. Объекты, которые сравнивают одинаковые, должны иметь одинаковое значение хеша.
Python ожидает, что __hash__
вернет целое число, возврат Banana()
не рекомендуется :)
Пользовательские классы имеют __hash__
по умолчанию вызывает id(self)
, как вы отметили.
В документации есть несколько дополнительных советов.:
Классы, которые наследуют метод
blockquote>__hash__()
от родительского класса, но изменяют значение__cmp__()
или__eq__()
таким образом, что возвращаемое значение хеша больше не подходит (например, путем перехода к концепции равенства, основанной на значении, вместо основанного на стандарте равенство) может явно обозначить себя как нечувствительный, установив__hash__ = None
в определение класса. Это означает, что не только экземпляры класса повышают соответствующий TypeError, когда программа пытается получить их хеш-значение, но они также будут корректно идентифицированы как нечувствительные при проверкеisinstance(obj, collections.Hashable)
(в отличие от классов, которые определяют свои собственные__hash__()
, чтобы явно поднять TypeError).
Альтернативой в Python 2.6 или выше является использование collections.namedtuple()
- это избавляет вас от написания каких-либо специальных методов:
from collections import namedtuple
MyThingBase = namedtuple("MyThingBase", ["name", "location"])
class MyThing(MyThingBase):
def __new__(cls, name, location, length):
obj = MyThingBase.__new__(cls, name, location)
obj.length = length
return obj
a = MyThing("a", "here", 10)
b = MyThing("a", "here", 20)
c = MyThing("c", "there", 10)
a == b
# True
hash(a) == hash(b)
# True
a == c
# False