1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__ = """Step
15
16 Utility for chaining defered actions.
17
18 """
19
20 from twisted.internet import reactor, defer
21
23 ''' Step through iterable looking for deferreds. Whenever a deferred is
24 encountered wait until it is called before continuing through iterable.
25
26 Iterable is usually a generator function that yields a defered
27 anytime it wants to wait for that deferred to trigger before
28 continuing execution.
29 '''
30 def doSteps(result):
31
32
33
34
35
36
37
38
39
40
41 for result in iterable:
42
43
44
45 if isinstance(result, defer.Deferred):
46 result.addCallback(doSteps)
47 return result
48 finalD.callback(result)
49 return result
50
51
52 if not hasattr(iterable, 'next'):
53 if hasattr(iterable, '__iter__'):
54 iterable = iter(iterable)
55 else:
56 raise RuntimeError( 'Must pass an iterable object to step' )
57
58
59 finalD = defer.Deferred()
60
61
62 doSteps(None)
63
64 return finalD
65
66
68
70 d = defer.Deferred()
71 reactor.callLater(2, d.callback, n)
72 return d
73
74
76 d1 = self.foo(1)
77 print 'yielding d1 from sequence'
78 yield d1
79 r1 = d1.result
80 d2 = self.foo(r1 + 1)
81 print 'yielding d2 from sequence'
82 yield d2
83 r2 = d2.result
84 print 'yielding final result from sequence'
85 yield r2
86
87
89 print 'final deferred returned %s' % `r`
90
91
97