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関数が完了してのをに送信するとresult、self.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
これにより、コードを破損することなく、より多くの状況で使用できるようになります。