d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
这是为什么?我查看了代码并提交了messages / Trac,并且没有理由说明为什么会出现这种情况。绕过这个的最明显的方法是将Deferred
置于一个元组中,但为什么这个限制首先出现在这里?
答案 0 :(得分:5)
有两个相关的原因。
首先,它有助于及早发现可能出现的错误 - 在错误发生的地方附近。使用结果调用Deferred,然后将结果传递给其所有回调。如果你将结果本身设为Deferred,那么这些回调在被调用时可以做的并不多。这引出了我的下一个原因。
其次,Deferreds支持 chaining ,它处理传递Deferred的最常见用例。给定两个延迟,a和b,链接导致a暂停处理其自己的回调链,直到b有结果,然后恢复其回调链,结果为b。当Deferred上的回调返回Deferred时会发生这种情况。它也可以使用Deferred.chainDeferred
明确地完成。