我正在尝试将延迟链接起来:
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
链接到d
,d.result
将为None
:
printx RESULT
printy RESULT
Result None
如何在链接另一个延迟时获取deferred.result
而不是None
?
答案 0 :(得分:2)
通常没有必要明确使用chainDeferred
。当从另一个回调中返回一个时,延迟会自动链接在一起。
直接使用Deferred.result
基本上总是错误的。获得Deferred结果的方法是向Deferred添加回调。当Deferred有结果时,将使用它调用回调。
将示例代码中的Deferred的创建和回调分开并不是惯用的。 getDeferred1
正在创建此代码最终回调的Deferred。 getDeferred1
对最终的d.callback
电话负责是不恰当的。
由于这段代码是抽象的,非惯用的,我不确定你要完成的是什么。我可以给出的唯一建议是你可能不需要chainDeferred
,你绝对不应该编写访问Deferred.result
的代码。