Twisted chainDeferred,deferred.result是None

时间:2015-03-04 17:06:46

标签: python twisted

我正在尝试将延迟链接起来:

def getDeferred1():
    d1 = defer.Deferred()
    d1.addCallback(printx)
    return d1

def getDeferred2():
    d2 = defer.Deferred()
    d2.addCallback(printy)
    return d2

def printx(x):
    print 'printx', x
    return x

def printy(y):
    print 'printy', y
    return y

d = getDeferred1()
d2 = getDeferred2()
# d.chainDeferred(d2)    #1
# d.addCallback(printy)  #2

d.callback('RESULT')
print 'Result', d.result

将打印出一些代码:

printx RESULT
Result RESULT

但如果我取消注释第1行,将d2链接到dd.result将为None

printx RESULT
printy RESULT
Result None

如何在链接另一个延迟时获取deferred.result而不是None

1 个答案:

答案 0 :(得分:2)

通常没有必要明确使用chainDeferred。当从另一个回调中返回一个时,延迟会自动链接在一起。

直接使用Deferred.result基本上总是错误的。获得Deferred结果的方法是向Deferred添加回调。当Deferred有结果时,将使用它调用回调。

将示例代码中的Deferred的创建和回调分开并不是惯用的。 getDeferred1正在创建此代码最终回调的Deferred。 getDeferred1对最终的d.callback电话负责是不恰当的。

由于这段代码是抽象的,非惯用的,我不确定你要完成的是什么。我可以给出的唯一建议是你可能不需要chainDeferred,你绝对不应该编写访问Deferred.result的代码。