d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
为什么是这样?我查看了代码并提交消息/ Trac 并没有看到为什么会这样。绕过这个最明显的方法是把 放在Deferred
一个元组中,但为什么这个限制首先在这里呢?
d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
为什么是这样?我查看了代码并提交消息/ Trac 并没有看到为什么会这样。绕过这个最明显的方法是把 放在Deferred
一个元组中,但为什么这个限制首先在这里呢?
这有两个相关的原因。
首先,它有助于及早发现可能的错误——靠近发生错误的地方。一个 Deferred 被回调并返回一个结果,然后将其传递给它的所有回调。如果您将结果本身设为 Deferred,那么这些回调在被调用时将无能为力。这让我想到了下一个原因。
其次,Deferred 支持链式处理,它可以处理传递 Deferred 的最常见用例。给定两个 Deferred,a 和 b,链接导致 a 暂停处理它自己的回调链,直到 b 有结果,然后 a 用 b 的结果恢复它的回调链。当 Deferred 上的回调返回 Deferred 时,就会发生这种情况。它也可以用Deferred.chainDeferred
.