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で、dbにリクエストします。min_normalizationで、データを処理します。そして、処理されたデータのinsert_dbには、dbへのリクエストが1つあります。

この場合、データはチェーンを介して送信され、簡単です。しかし、チェーンの途中でコールバックよりも多く実行する必要がある場合はどうでしょうか。

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では、min_active_stackではなくdeferredstack_shiftから取得されます。

私自身は、stack_shifttに行を追加することでこの問題を解決しました。

self.temp=d   

そして、min_normalizationでself.tempを使用します。

しかし、正しい決定に関しては?

4

1 に答える 1

2

私は実際に問題を理解していません。min_active_stack()からstack_shift()を介してmin_normalization()に結果を渡すことができないのはなぜですか?

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

または、stack_shiftで非同期で何かを実行したいように見えるので、Deferredに相当するものは次のとおりです。

def stack_shift(res):
    d = runQuery(query)
    d.addCallback(lambda ignored: res)
    return d
于 2011-09-02T07:20:04.953 に答える