1
0

defer.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # DO NOT USE THIS MODULE!
  2. # this is for khashmir compatability only. new application should use BTL.defer
  3. class Deferred(object):
  4. __slots__ = ['callbacks', 'errbacks',
  5. 'calledBack', 'erredBack',
  6. 'results', 'failures',]
  7. def __init__(self):
  8. self.callbacks = []
  9. self.errbacks = []
  10. self.calledBack = False
  11. self.erredBack = False
  12. self.results = []
  13. self.failures = []
  14. def addCallback(self, cb, *args, **kwargs):
  15. assert callable(cb)
  16. t = (cb, args, kwargs)
  17. self.callbacks.append(t)
  18. if self.calledBack:
  19. self.doCallbacks(self.results, [t])
  20. return self
  21. def addErrback(self, cb, *args, **kwargs):
  22. assert callable(cb)
  23. t = (cb, args, kwargs)
  24. self.errbacks.append(t)
  25. if self.erredBack:
  26. self.doCallbacks(self.failures, [t])
  27. return self
  28. def addCallbacks(self, cb, eb, args=(), kwargs={},
  29. ebargs=(), ebkwargs={}):
  30. self.addCallback(cb, *args, **kwargs)
  31. self.addErrback(eb, *ebargs, **ebkwargs)
  32. def chainDeferred(self, d):
  33. return self.addCallbacks(d.callback, d.errback)
  34. def callback(self, result):
  35. self.results.append(result)
  36. self.calledBack = True
  37. if self.callbacks:
  38. self.doCallbacks([result], self.callbacks)
  39. def errback(self, failed):
  40. self.failures.append(failed)
  41. self.erredBack = True
  42. if self.errbacks:
  43. self.doCallbacks([failed], self.errbacks)
  44. def doCallbacks(self, results, callbacks):
  45. for result in results:
  46. for cb, args, kwargs in callbacks:
  47. result = cb(result, *args, **kwargs)