Created
February 9, 2012 21:04
-
-
Save mharju/1783090 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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