Como anexe dois retornos de chamada separados a um Twisted adiado, para que ambos sejam acionados depois que o resultado estiver pronto?
-
21-12-2019 - |
Pergunta
Não tenho muita experiência com Twisted, mas aqui está o que entendi até agora.
Quando faço uma consulta ao banco de dados como:
db = database.veryLongQuery(sql, binds)
Posso adicionar retornos de chamada para fazer algo com o resultado,
db.addCallback(lambda res: dispalyResult(res))
Caso contrário, se eu precisar fazer várias coisas para obter o mesmo resultado, posso criar um 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
e anexe isso a db
(como o primeiro retorno de chamada)
db.addCallback(self.doTwoThings)
No entanto, gostaria de ter uma referência a d1
e d2
desde o início, ao mesmo tempo em que o banco de dados é criado, pois outros eventos estarão acontecendo e preciso adicionar retornos de chamada ao d1
e d2
.
Como eu anexaria duas (ou mais) cadeias de retorno de chamada separadas na mesma cadeia de retorno de chamada adiada, db
, então ele 'divide' e ambos são disparados lado a lado quando o resultado está pronto?
Dessa forma, posso acompanhar cada adiamento desde o início e acessá-los conforme necessário.
Ou existe uma maneira de criar d1
e d2
desde o início, então tenho acesso a esses nomes?
Solução
Você pode usar algo assim:
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)
Então, sempre que d1 obtiver resultado, ele passará para d2 também.