2012-05-15 3 views
0

J'ai une partie du code asynchrone dans mes gestionnaires, j'ai besoin de faire cette partie comme méthode externe et d'exécuter à partir de différents gestionnaires, mais chaque méthode a un code asynchrone. Pouvez-vous m'aider?méthode asynchrone externe à l'intérieur de la méthode asynchrone

exemple simple:

#!/usr/bin/python 

import asyncmongo 
import tornado.web  

class Handler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
              port=27107, dbname='mydb') 

     self.db.first_names.find_one({'user_id': 1 }, 
            callback=self._on_response) 


    def _on_response(self, response, error): 
     first_name = response['first_name'] 
     data = { 
       'first_name': first_name 
     } 

     # use processor 
     first_name_html = self.generate_html("firstname.html").generate(**data) 
     last_name_html = foo() 
     self.write(first_name_html + last_name_html) 
     self.finish() 

    # this part of code is wrong! 
    # I have question about it 
    @tornado.web.asynchronous 
    def foo(self): 
     self.db.last_names.find_one({'user_id': 1 }, 
           callback=self._on_response_two) 

    def _on_response_two(self, response, error): 
     last_name = response['last_name'] 
     data = { 
       'last_name': last_name 
     } 

     # use processor 
     last_name_html = self.generate_html("lastname.html").generate(**data) 
     return last_name_html 
+0

Il semble que l'utilisateur devrait avoir un prénom et un nom de famille est-il une raison pour laquelle ils sont divisés en 2 collections différentes? – dm03514

Répondre

0

Je suggère

#!/usr/bin/python 

import asyncmongo 
import tornado.web  

class Handler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
              port=27107, dbname='mydb') 

     self.db.first_names.find_one({'user_id': 1 }, 
            callback=self._on_response) 


    def _on_response(self, response, error): 
     first_name = response['first_name'] 
     data = { 
       'first_name': first_name 
     } 

     # use processor 
     self.first_name_html = self.generate_html("firstname.html").generate(**data) 
     foo() 

    def foo(self): 
     self.db.last_names.find_one({'user_id': 1 }, 
           callback=self._on_response_two) 

    def _on_response_two(self, response, error): 
     last_name = response['last_name'] 
     data = { 
       'last_name': last_name 
     } 

     # use processor 
     last_name_html = self.generate_html("lastname.html").generate(**data) 
     self.write(self.first_name_html + last_name_html) 
     self.finish() 
0

Je pencherais pour la version gen.engine, juste pour plus de clarté.

#!/usr/bin/python 

import asyncmongo 
import tornado.web 
from tornado import gen 

class Handler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    @gen.engine 
    def get(self): 
     self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
              port=27107, dbname='mydb') 

     response, error = yield gen.Task(self.db.first_names.find_one, {'user_id': 1 }) 

     first_name = response['first_name'] 
     data = { 
       'first_name': first_name 
     } 

     # use processor 
     self.first_name_html = self.generate_html("firstname.html").generate(**data) 

     self.foo() 

    @gen.engine 
    def foo(self): 
     response, error = yield gen.Task(self.db.last_names.find_one, {'user_id': 1 }) 

     last_name = response['last_name'] 
     data = { 
       'last_name': last_name 
     } 

     # use processor 
     last_name_html = self.generate_html("lastname.html").generate(**data) 
     self.write(self.first_name_html + last_name_html) 
     self.finish() 
Questions connexes