¿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?
-
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?
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.