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
は値を返し、それをに格納します。callback
gen.Task
result
これで、好きなように使用できます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
これにより、コードを破損することなく、より多くの状況で使用できるようになります。