Как прикрепить два отдельных обратных вызова к исключенным отложенным, поэтому оба пожара после того, как результат готов?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top