2011-09-02 76 views
2

閱讀文檔和一些使用案例後。這個問題引發瞭如何使用回調鏈。更確切地說如何回調扭曲的延期回調鏈

這之間傳輸數據是代碼:

d = defer.Deferred() 
d.addCallback(self.min_active_stack) 
d.addCallback(self.min_normalization) 
d.addCallback(self.insert_db) 
d.callback(0) 

def min_active_stack(self,d): 
    ... 
    return self.dbconn.runQuery(sql_query) 

def min_normalization(self,min): 
    ... 
    return min[0][0]+self.x 

def insert_db(self,min_norm): 
    ... 
    return self.dbconn.runQuery(sql_query) 

首先,在min_active_stack我請求分貝。在min_normalization中,我處理數據。和insert_db處理的數據我有一個請求數據庫。

在這種情況下,數據通過鏈傳輸,很簡單。 但是,如果在鏈的中間需要運行更多的回調。

d = defer.Deferred() 
d.addCallback(self.min_active_stack) 
d.addCallback(self.stack_shift) 
d.addCallback(self.min_normalization) 
d.addCallback(self.insert_db) 
d.callback(0) 

def stack_shift(self, d): 
    return self.dbconn.runQuery(query) 

在stack_shift中沒有使用任何外部數據,但應該在min_active_stack之前和insert_db之前運行。事實證明,min_normalization來自延遲stack_shift而不是min_active_stack。

至於我自己,我在stack_shiftt添加一行解決了這個問題:在min_normalization

self.temp=d 

而且使用self.temp。

但是,只要正確的決定?

+0

你爲什麼不能在stack_shift添加collback?如果需要的話,你也可以在addCallback中傳遞參數 – varela

回答

2

我其實不明白這個問題。爲什麼你不能只將min_active_stack()的結果通過stack_shift()傳遞給min_normalization()?

def stack_shift(res): 
    # do something usefull 
    return res 

還是因爲它看起來像你想要做的事異步在stack_shift,遞延相當於:

def stack_shift(res): 
    d = runQuery(query) 
    d.addCallback(lambda ignored: res) 
    return d