from somefolder import somelibrary
@gen.coroutine
def detailproduct(url):
datafromlib=yield somelibrary(url)
raise gen.Return(datafromlib)
期望: 查看没有请求处理程序的结果。 不是
的结果{"data":<tornado.concurrent.future>}
我尝试这样的链接: “Can't call result() on futures in tornado” 但不行。
有人帮助我! TX
答案 0 :(得分:1)
在使用gen.coroutine
时,您必须牢记两条规则:
gen.coroutine
修饰函数将自动返回Future。gen.coroutine
修饰的协程,则还必须使用gen.coroutine
进行修饰,并且必须使用yield
关键字来获取其结果。 detailproduct
饰有gen.coroutine
- 这意味着它将始终返回包裹在未来中的datafromlib
。
如何修复
根据规则2,您必须使用gen.coroutine
修饰来电者并使用yield
关键字来获取未来的结果。
@gen.coroutine
def my_func():
data = yield detailproduct(url)
# do something with the data ...
OR
您可以在Future上设置一个回调函数,该函数将在解析后调用。但它使代码变得混乱。
def my_fun():
data_future = detailproduct(url)
data_future.add_done_callback(my_callback)
def my_callback(future):
data = future.result()
# do something with the data ...