2010-02-23 58 views
2
d = Deferred() 
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed 

這是爲什麼?我查看了代碼並提交了消息/ Trac,並沒有看到爲什麼會出現這種情況。繞過這個最明顯的方法是將Deferred放在一個元組中,但爲什麼這裏限制在這裏呢?爲什麼無法將延遲傳遞給Python中的回調扭曲?

回答

5

有兩個相關的原因。

首先,它有助於儘早發現可能是錯誤的地方 - 靠近發生錯誤的地方。一個Deferred被調用回來,然後傳遞給它的所有回調函數。如果您將結果本身設爲延遲,那麼調用這些回調函數時可以執行的操作並不多。這導致我下一個原因。

其次,延期支持是鏈接它處理最常見的用例可能會傳遞延遲。給定兩個Deferreds,a和b,鏈接會導致a暫停處理自己的回調鏈,直到b得到結果,然後恢復其回調鏈,結果爲b。當Deferred的回調返回Deferred時會發生這種情況。它也可以用Deferred.chainDeferred明確地完成。

相關問題