Comment puis-je attacher deux rappels distincts à un Twisted différé, afin que les deux se déclenchent une fois le résultat prêt ?
-
21-12-2019 - |
Question
Je ne suis pas très expérimenté avec Twisted, mais voici ce que j'ai compris jusqu'à présent.
Lorsque je fais une requête de base de données telle que :
db = database.veryLongQuery(sql, binds)
Je peux ajouter des rappels pour faire quelque chose avec le résultat,
db.addCallback(lambda res: dispalyResult(res))
Sinon, si je dois faire plusieurs choses pour obtenir le même résultat, je pourrais créer une méthode :
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
et attachez-le à db
(comme premier rappel)
db.addCallback(self.doTwoThings)
Cependant, j'aimerais avoir une référence à d1
et d2
dès le début, en même temps que la création de la base de données, car d'autres événements vont se produire et je dois ajouter des rappels à d1
et d2
.
Comment pourrais-je attacher deux (ou plus) chaînes de rappel distinctes sur le même différé, db
, donc il se « divise », et les deux sont tirés côte à côte une fois que le résultat est prêt ?
De cette façon, je peux garder une trace de chaque différé depuis le début et y accéder si nécessaire.
Ou existe-t-il un moyen de créer d1
et d2
depuis le début, donc j'ai accès à ces noms ?
La solution
Vous pouvez utiliser quelque chose comme ceci :
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)
Ainsi, chaque fois que d1 obtient un résultat, il le transmettra également à d2.