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

时间:2014-06-05 04:41:52

标签: python-2.7 twisted deferred

我对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,同时创建db时,因为其他事件将会发生,我需要添加回调到d1d2

我如何将两个(或多个)单独的回调链附加到同一个延迟的db上,所以它'拆分',并且一旦结果准备好,它们会并排发射?

通过这种方式,我可以跟踪从开始时延迟的每个延迟,并在必要时访问它们。

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

1 个答案:

答案 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。