[Twisted-Python] Adding callback to a Deferred that's already running?

Steve Freitas sflist at ihonk.com
Thu Aug 26 00:34:49 EDT 2004


Hi all,

I've got an XML-RPC app that has to grab some data from a SQL database, then 
depending on the results, make some more SQL calls, make some more decisions, 
then finally return a result. So, I'm hip-deep in Deferreds. So, here's the 
idiom I've come up with, and I'm running into a limitation with it, namely 
that I can't seem to add callbacks to a Deferred after it has started 
running. Here's what I'm doing in abbreviated form, and it's an idiom I'd 
like to stick with, if possible:

class MyXmlRpcClass(xmlrpc.XMLRPC):
  def__init__(self):
    self.db = adbapi.ConnectionPool(blah)

  def xmlrpc_foo(self):
    return FooClass(self.db).step1() # This returns a deferred, see below

class FooClass(General):
    def __init__(self, db):
        self.db = db

    def step1(self):
        self.d = self.db.runQuery(blah)
        self.d.addCallback(self.step2)
        return self.d

    def step2(self, query):
 if query == 'yadda':
          return 'This bit works'
        else:
          self.d.chainDeferred(self.db.runOperation(blah))
          self.d.addCallback(self.step3)
            
    def step3(self, data):
        return "Never gets here!"

If I get to the part where it adds the callback for step3, it ends up giving 
an AlreadyCalled exception in Deferred. So, I expect there's a good way to 
add to a running Deferred, no?

Thanks!

Steve




More information about the Twisted-Python mailing list