为什么不能将延迟传递给Python Twisted中的回调?

时间:2010-02-23 20:46:09

标签: python twisted deferred-execution

d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed

这是为什么?我查看了代码并提交了messages / Trac,并且没有理由说明为什么会出现这种情况。绕过这个的最明显的方法是将Deferred置于一个元组中,但为什么这个限制首先出现在这里?

1 个答案:

答案 0 :(得分:5)

有两个相关的原因。

首先,它有助于及早发现可能出现的错误 - 在错误发生的地方附近。使用结果调用Deferred,然后将结果传递给其所有回调。如果你将结果本身设为Deferred,那么这些回调在被调用时可以做的并不多。这引出了我的下一个原因。

其次,Deferreds支持 chaining ,它处理传递Deferred的最常见用例。给定两个延迟,a和b,链接导致a暂停处理其自己的回调链,直到b有结果,然后恢复其回调链,结果为b。当Deferred上的回调返回Deferred时会发生这种情况。它也可以使用Deferred.chainDeferred明确地完成。