2011-09-02 44 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