我对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)
但是,我想从一开始就引用d1
和d2
,同时创建db时,因为其他事件将会发生,我需要添加回调到d1
和d2
。
我如何将两个(或多个)单独的回调链附加到同一个延迟的db
上,所以它'拆分',并且一旦结果准备好,它们会并排发射?
通过这种方式,我可以跟踪从开始时延迟的每个延迟,并在必要时访问它们。
或者,有没有办法从一开始就创建d1
和d2
,所以我可以访问这些名称?
答案 0 :(得分:1)
您可以使用以下内容:
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。