我有一个像这样的简单处理程序:
@asynchronous
@gen.engine
def post(self):
result = functionOne()
foo = MyObject()
bar = AnotherObject()
但我希望结果返回,然后执行 foo,然后按顺序执行 bar。我尝试过按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但运气不佳。
谢谢!
我有一个像这样的简单处理程序:
@asynchronous
@gen.engine
def post(self):
result = functionOne()
foo = MyObject()
bar = AnotherObject()
但我希望结果返回,然后执行 foo,然后按顺序执行 bar。我尝试过按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但运气不佳。
谢谢!
您正在使用 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 )
在 a 中使用时,上面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
时,将返回该值并将其存储在.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
正确使用,否则您将无法返回结果。
这就是我的第二个令人困惑的例子发挥作用的地方。
为了绕过这个要求并允许我的代码在有gen.Task
和没有的情况下工作,我执行以下操作。
def delete_customer( customer_id, callback=None ):
result = customerService.delete_customer( customer_id )
if callback:
callback( result )
return result
这使我可以在更多情况下使用代码而不会损坏。