Skip to content

Instantly share code, notes, and snippets.

@mharju
Created February 9, 2012 21:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mharju/1783090 to your computer and use it in GitHub Desktop.
Save mharju/1783090 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8
import random
class APIHandler(object):
def __init__(self):
self.queue = list()
def do_api_request(self, *args, **kwargs):
# tässä koko kupletin juoni. työnnetään paikallisesti määritelty
# blocki, jolla oma sulkeuma, pointteriksi listaan, jota sitten
# kutsutaan pyynnön valmistuttua. Demon vuoksi
# laitetaan tuo request_id tuonne responssiin mukaan
request_id = random.randint(512, 1024)
def _api_request_done(response):
kwargs['handler'](request_id, response)
self.queue.append(_api_request_done)
def request_completed(self, answer):
self.queue[0](answer)
self.queue = self.queue[1:]
def composite_request(self, donehandler):
def _got_em(callback):
def _check(*args):
callback(*args)
if 'foo' in response and 'bar' in response:
donehandler(response)
return _check
@_got_em
def _got_foo_response(request_id, resp):
response['foo'] = resp
@_got_em
def _got_bar_response(request_id, resp):
response['bar'] = resp
response = dict()
handler.do_api_request(url="foo", handler=_got_foo_response)
handler.do_api_request(url="bar", handler=_got_bar_response)
def another_request(self, callback):
handler.do_api_request(url="barbaz", handler=callback)
def _composite_done(total):
print "Composite request done",total
def _barbaz_done(request_id, response):
print "barbaz done", request_id, response
handler = APIHandler()
handler.composite_request(_composite_done)
handler.another_request(_barbaz_done)
# Oletetaan, että nämä tulevat oikeassa järjestyksessä.
# Muuten menee mahdottomaksi pelkällä meidän kontrollin ulkopuolella olevan callbackin kutsumisella.
handler.request_completed(answer=42)
handler.request_completed(answer=15)
handler.request_completed(answer=22)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment