1

私はそのような単純なハンドラーを持っています:

@asynchronous
@gen.engine
def post(self):
    result = functionOne()
    foo = MyObject()
    bar = AnotherObject()

しかし、結果が戻ってきて、fooを実行し、次にbarを順番に実行したいと思います。http://www.tornadoweb.org/documentation/gen.htmlに従ってネストされたコールバックを使用してみましたが、運が悪かったです。

どうも!

4

1 に答える 1

4

gen.engineを使用していますが、メソッド呼び出しを呼び出しで行う必要がありyieldますgen.Task

私のプロジェクトの例:

customer = yield gen.Task( self.paymentService.charge, email, cardUri )
sub = yield gen.Task( self.paymentService.schedule, customer )

上記は、最初にそのcharge部分を実行し、次に結果を返し、次にを呼び出し、その呼び出しからオブジェクトscheduleを返します。subscription

呼び出すメソッドはgen.Task、次のようになっている必要があります。

def customer( self, email, cardUri, callback=None ):

callbackから値を実際に返すために呼び出す関数はどこにありますかgen.Task

コールバックの有無にかかわらず動作するように設定しているので、メソッドをより簡単にテストできます。callbackこれは、そうであるかどうかの単純なテストでNoneあり、そうでない場合Noneは呼び出され、そうでない場合は正常に戻ります。

gen.Engineドキュメント

編集:

さて、上記を明確にするために、それで動作する完全な関数gen.Tasksは次のようになります。

def delete_customer( customer_id, callback ):
    result = customerService.delete( customer_id )

    callback( result )

上記をで使用するgen.Taskと、次のようになります。

@gen.engine
def perform_customer_delete( customer_id )
    result = yield gen.Task( delete_customer, customer_id )
    return result

delete_customerこれは、パラメーターを使用してを呼び出すことを意味します。customer_id次に、この関数の結果であるreturnをに渡しresultます。したがって、delete_customer関数が完了してのをに送信するとresultself.customerService.deleteは値を返し、それをに格納します。callbackgen.Taskresult

これで、好きなように使用できますresult。私の例では、それが返されます。

あなたの例では、次のようにしたいと思います。

@asynchronous
@gen.engine
def post(self):
    result = yield gen.Task( functionOne )
    foo = yield gen.Task( MyObject )
    bar = yield gen.Task( AnotherObject )

これにより、最初にが呼び出さfunctionOneれ、次に次に進み、gen.Taskなどが実行されMyObjectます。callbackただし、正しく使用するには、メソッドにパラメーターがあるパターンに従う必要がありますgen.Task。そうしないと、結果を取り戻すことができません。

ここで、私の2番目の紛らわしい例が登場します。

この要件を回避し、コードが機能するようにするためにgen.Task、次のことを行います。

def delete_customer( customer_id, callback=None ):
    result = customerService.delete_customer( customer_id )
    if callback:
        callback( result )
    return result

これにより、コードを破損することなく、より多くの状況で使用できるようになります。

于 2012-11-11T07:52:28.860 に答える