Как я могу сделать обратный вызов за пределами класса?
Это звучит как очень распространенное недоразумение. В результате недопонимания, вопрос, который задают, не имеет большого смысла. Итак, давайте забудем о вопросе.
У вас уже есть код, который использует Deferreds. Давайте начнем с mainmyServ
:
def mainmyServ(self):
# print "Client ID is: " + self.myServID
# Joining Chat
s1= DeferredList([client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID),])
s1.addCallback(self.connectedtomyServService)
s1.addErrback(self.error)
Во-первых, вы можете избавиться от DeferredList
. В вашем списке только один Deferred
, поэтому DeferredList
не добавляет никакого значения. Вы получите практически такое же поведение, как это, и ваши обратные вызовы могут быть упрощены, удалив все выражения [0][0]
.
def mainmyServ(self):
# print "Client ID is: " + self.myServID
# Joining Chat
s1= client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID)
s1.addCallback(self.connectedtomyServService)
s1.addErrback(self.error)
Так что это совершенно разумный метод, который вызывает функцию, которая возвращает Deferred, а затем добавляет обратный вызов и errback к этому Deferred. Скажем, у вас есть другая функция, возможно, ваша основная функция:
def main():
service = ChatService()
service.mainmyServ()
Что мешает функции main
добавлять дополнительные обратные вызовы к Deferred
в mainmyServ
? Только это mainmyServ
не удосуживается вернуть его. Итак:
def mainmyServ(self):
# print "Client ID is: " + self.myServID
# Joining Chat
s1= client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID)
s1.addCallback(self.connectedtomyServService)
s1.addErrback(self.error)
return s1
def main():
service = ChatService()
d = service.mainmyServ()
d.addCallback(doSomethingElse)
Ничего особенного, это просто еще один addCallback
. Все, что вам не хватало, - это ссылка на Deferred
.
Теперь вы можете настроить цикл, doSomethingElse
вызвав другой метод на ChatService
. Если этот другой метод возвращает Deferred
, тогда doSomethingElse
может добавить к нему обратный вызов, который снова вызывает mainmyServ
. И так далее. Вот твой цикл, контролируемый "снаружи" класса.