Come fisso due callback separati a un intrecciato differito, quindi entrambi il fuoco dopo il risultato è pronto?
-
21-12-2019 - |
Domanda
Non sono molto esperto con contorto, ma qui è quello che capisco finora.
Quando faccio una query del database come:
db = database.veryLongQuery(sql, binds)
.
Posso aggiungere callback per fare qualcosa con il risultato,
db.addCallback(lambda res: dispalyResult(res))
.
Altrimenti se ho bisogno di fare più cose allo stesso risultato, potrei fare un metodo:
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
.
e collegalo a db
(come primo callback)
db.addCallback(self.doTwoThings)
.
Tuttavia, vorrei avere un riferimento a d1
e d2
direttamente dall'inizio, contemporaneamente in cui viene creato DB, poiché gli altri eventi avvieranno e ho bisogno di aggiungere callback a d1
e d2
. .
Come faccio a fissare due (o più) catene di callback separate sullo stesso differite, db
, in modo che "divide", ed entrambi sono sparati fianco a fianco una volta che il risultato è pronto?
In questo modo posso tenere traccia di ciascuna differita dall'inizio e accederle se necessario.
O, è lì per creare d1
e d2
dall'inizio, quindi ho accesso a tali nomi?
Soluzione
Puoi usare qualcosa del genere:
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)
.
Quindi, ogni volta che D1 ottiene il risultato, lo passerà anche a D2.