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 ?

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

  •  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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top