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