Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import sys | 5 import sys |
| 6 | 6 |
| 7 _no_value = object() | 7 _no_value = object() |
| 8 | 8 |
| 9 | 9 |
| 10 def _DefaultErrorHandler(error): | 10 def _DefaultErrorHandler(error): |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 self._exc_info = exc_info | 62 self._exc_info = exc_info |
| 63 if (self._value is _no_value and | 63 if (self._value is _no_value and |
| 64 self._callback is None and | 64 self._callback is None and |
| 65 self._exc_info is None): | 65 self._exc_info is None): |
| 66 raise ValueError('Must have either a value, error, or callback.') | 66 raise ValueError('Must have either a value, error, or callback.') |
| 67 | 67 |
| 68 def Then(self, callback, error_handler=_DefaultErrorHandler): | 68 def Then(self, callback, error_handler=_DefaultErrorHandler): |
| 69 '''Creates and returns a future that runs |callback| on the value of this | 69 '''Creates and returns a future that runs |callback| on the value of this |
| 70 future, or runs optional |error_handler| if resolving this future results in | 70 future, or runs optional |error_handler| if resolving this future results in |
| 71 an exception. | 71 an exception. |
| 72 | |
| 73 If |callback| returns a Future then Then() will resolve to the same value | |
|
Yoyo Zhou
2014/08/05 21:52:36
These 2 sentences are confusing next to each other
not at google - send to devlin
2014/08/05 23:00:54
This is tricky to explain. I had another go.
| |
| 74 of that Future. Otherwise, Then() will resolve to that value. | |
| 75 | |
| 76 For example, | |
| 77 | |
| 78 def fortytwo(): | |
| 79 return 42 | |
| 80 def inc(x): | |
| 81 return x + 1 | |
| 82 def inc_future(x): | |
| 83 return Future(value=x + 1) | |
| 84 | |
| 85 fortywho().Then(inc).Get() ==> 43 | |
| 86 fortywho().Then(inc_future).Get() ==> 43 | |
| 72 ''' | 87 ''' |
| 73 def then(): | 88 def then(): |
| 89 val = None | |
| 74 try: | 90 try: |
| 75 val = self.Get() | 91 val = self.Get() |
| 76 except Exception as e: | 92 except Exception as e: |
| 77 return error_handler(e) | 93 val = error_handler(e) |
| 78 return callback(val) | 94 else: |
| 95 val = callback(val) | |
| 96 return val.Get() if isinstance(val, Future) else val | |
| 79 return Future(callback=then) | 97 return Future(callback=then) |
| 80 | 98 |
| 81 def Get(self): | 99 def Get(self): |
| 82 '''Gets the stored value, error, or callback contents. | 100 '''Gets the stored value, error, or callback contents. |
| 83 ''' | 101 ''' |
| 84 if self._value is not _no_value: | 102 if self._value is not _no_value: |
| 85 return self._value | 103 return self._value |
| 86 if self._exc_info is not None: | 104 if self._exc_info is not None: |
| 87 self._Raise() | 105 self._Raise() |
| 88 try: | 106 try: |
| 89 self._value = self._callback() | 107 self._value = self._callback() |
| 90 return self._value | 108 return self._value |
| 91 except: | 109 except: |
| 92 self._exc_info = sys.exc_info() | 110 self._exc_info = sys.exc_info() |
| 93 self._Raise() | 111 self._Raise() |
| 94 | 112 |
| 95 def _Raise(self): | 113 def _Raise(self): |
| 96 exc_info = self._exc_info | 114 exc_info = self._exc_info |
| 97 raise exc_info[0], exc_info[1], exc_info[2] | 115 raise exc_info[0], exc_info[1], exc_info[2] |
| OLD | NEW |