Как прикрепить два отдельных обратных вызова к исключенным отложенным, поэтому оба пожара после того, как результат готов?
-
21-12-2019 - |
Вопрос
Я не очень опыт с витой, но вот то, что я понимаю так далеко.
Когда я делаю запрос базы данных, такой как:
db = database.veryLongQuery(sql, binds)
.
Я могу добавить обратные вызовы, чтобы что-то сделать с результатом,
db.addCallback(lambda res: dispalyResult(res))
.
В противном случае, если мне нужно делать несколько вещей в тот же результат, я мог бы сделать метод:
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
.
и прикрепите это к db
(как первый обратный вызов)
db.addCallback(self.doTwoThings)
.
Тем не менее, я хотел бы иметь ссылку на d1
и d2
прямо с самого начала, в то же время, как когда будет создан БД, поскольку другие события будут происходить, и мне нужно добавить обратные вызовы для d1
и d2
. .
Как бы я пошел при прикреплении двух (или более) отдельных цепей обратного вызова на тот же отсроченный, генеракодицетагкод, так что он «разделен», и оба увольняются бок о бок, как только результат готов?
Таким образом, я могу отслеживать каждый отсроченный от начала и доступа к ним по мере необходимости.
Или, есть ли способ создать генеракодицетагкод и генеракодицетагCode с самого начала, поэтому у меня есть доступ к тем именам?
Решение
Вы можете использовать что-то вроде этого:
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)
.
Итак, всякий раз, когда D1 получает результат, он тоже передает его D2.