如何将两个单独的回调附加到 Twisted 延迟,以便在结果准备好后都触发?

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

  •  21-12-2019
  •  | 
  •  

我对 Twisted 不太有经验,但这是我到目前为止的理解。
当我进行数据库查询时,例如:

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)

不过,我想参考一下 d1d2 从一开始,在创建数据库的同时,因为其他事件将会发生,我需要添加回调 d1d2.

我将如何将两个(或更多)单独的回调链附加到同一个延迟上, db, ,所以它“分裂”,并且一旦结果准备好,两者就会并排被解雇?

这样我就可以从一开始就跟踪每个延迟并根据需要访问它们。

或者,有没有办法创建 d1d2 从一开始,我就可以访问这些名字?

有帮助吗?

解决方案

你可以使用这样的东西:

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