为什么无法将延迟传递给Python中的回调扭曲?

为什么无法将延迟传递给Python中的回调扭曲?

问题描述:

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

这是为什么?我查看了代码并提交了消息/ Trac,并没有看到为什么会出现这种情况。绕过这个最明显的方法是将Deferred放在一个元组中,但为什么这里限制在这里呢?为什么无法将延迟传递给Python中的回调扭曲?

有两个相关的原因。

首先,它有助于尽早发现可能是错误的地方 - 靠近发生错误的地方。一个Deferred被调用回来,然后传递给它的所有回调函数。如果您将结果本身设为延迟,那么调用这些回调函数时可以执行的操作并不多。这导致我下一个原因。

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