from twisted.internet import defer
def status(*ds):
return [(getattr(d, 'result', "N/A"), len(d.callbacks)) for d in ds]
def b_callback(arg):
print "b_callback called with arg =", arg
return b
def on_done(arg):
print "on_done called with arg =", arg
return arg
a = defer.Deferred()
b = defer.Deferred()
a.addCallback(b_callback).addCallback(on_done)
status(a, b) # [('N/A', 2), ('N/A', 0)]
a.callback(3) # b_callback called with arg = 3
status(a, b) # [(<Deferred at 0x7f219e4117a0>, 1), ('N/A', 1)]
b.callback(4) # on_done called with arg = 4
status(a, b) # [(4, 0), (None, 0)]
a.callback(3)
之后 b 也有了 on_done
callback。这里没明白。b.callback(4)
之后 a 的 on_done 也执行了,但只输出了一个 on_done called with arg = 4,且 b 的 result 是 None 不是 4 ??
1
lbfeng OP 我自问自答吧。。。
`b` get a callback function after `a.callback(3)`. By checking the source code( https://github.com/twisted/twisted/blob/twisted-18.7.0/src/twisted/internet/defer.py#L438). It seems that `b` is appended an "a is waiting for b to fire" callback. Chain would stop here since function `b_callback` return deferred `b`, and `b` would be the result of `a`. Note: if result is a value instead of a deferred object, chain will continue. `b.callback(4)` passes `4` to `a`'s next callback as an argument. `b` get a `None` as a result. The chain continues. |