我有一个像这样的简单处理程序:
@asynchronous
@gen.engine
def post(self):
result = functionOne()
foo = MyObject()
bar = AnotherObject()
但我希望结果回来,然后执行foo,然后按顺序排列。我已尝试按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但没有太多运气。
THX!
答案 0 :(得分: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.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
,然后我希望将此函数的结果(返回)提供给result
。因此,当delete_customer
函数完成并将result
的{{1}}发送到self.customerService.delete
时,callback
将返回该值并将其存储在{{} 1}}。
现在,您可以根据需要使用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
这使我可以在更多情况下使用代码而不会破损。