Como anexe dois retornos de chamada separados a um Twisted adiado, para que ambos sejam acionados depois que o resultado estiver pronto?

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top