¿Cómo adjunto dos devoluciones de llamada separadas a un Twisted diferido, para que ambas se activen después de que el resultado esté listo?

StackOverflow https://stackoverflow.com//questions/24051762

  •  21-12-2019
  •  | 
  •  

Pregunta

No tengo mucha experiencia con Twisted, pero esto es lo que entiendo hasta ahora.
Cuando hago una consulta de base de datos como:

db = database.veryLongQuery(sql, binds)

Puedo agregar devoluciones de llamada para hacer algo con el resultado,

db.addCallback(lambda res: dispalyResult(res))

De lo contrario, si necesito hacer varias cosas para obtener el mismo resultado, podría crear un método:

def doTwoThings(self, res):
    self.d1 = anotherDeferred(res) # write to table A, return lastRowId
    self.d2 = yetAnotherDeferred(res) # write to table B, return lastRowId
    return d1

y adjunte eso a db (como la primera devolución de llamada)

db.addCallback(self.doTwoThings)

Sin embargo, me gustaría tener una referencia a d1 y d2 desde el principio, al mismo tiempo que se crea la base de datos, ya que sucederán otros eventos y necesito agregar devoluciones de llamada a d1 y d2.

¿Cómo haría para adjuntar dos (o más) cadenas de devolución de llamada separadas al mismo diferido, db, por lo que se 'divide' y ambos se disparan uno al lado del otro una vez que el resultado está listo.

De esta manera puedo realizar un seguimiento de cada diferido desde el principio y acceder a ellos según sea necesario.

¿O hay alguna manera de crear d1 y d2 desde el principio, ¿entonces tengo acceso a esos nombres?

¿Fue útil?

Solución

Puede usar algo como esto:

def splitResults(d1, d2):
    def splitter(val):
        # Pass val to d2 chain
        d2.callback(val)
        # Return val into d1's chain
        return val

    def splitterError(err):
        d2.errback(err)
    d1.addCallbacks(splitter, splitterError)

Entonces, cada vez que se produce D1, también lo pasará a D2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top