我有一个异步管理模块调用的应用程序:
这是返回延迟到主应用程序的代码:
Cho
要异步附加一些代码,我需要在延迟函数中连接我的函数调用,如下所示:
my_hash.map { |k, a| [k, a.size] }.to_h.sort_by {|_key, value| value}.to_h.keys.last(2)
麻烦的是,每个连接的函数都会收到一个包含回调参数的参数(application.L_CONNECT)。
是否可以在不传输每个函数调用中的返回码的情况下实现此目的?
理想情况下,我希望我的回调函数是这样的:
def xxfi_connect(self, hostname):
d = defer.Deferred()
d.callback(Milter.ReturnCodes.CONTINUE)
return d
而不是
d = defer.Deferred()
d.addCallback(self.run_mods, application.L_CONNECT)
d.callback(Milter.ReturnCodes.CONTINUE)
因为仅在链的末尾需要def run_mods(self, level):
pass
(Milter.ReturnCodes.CONTINUE)
答案 0 :(得分:0)
区分成功或错误的Deferred()
已经是内置的功能。
>>> from twisted.internet import defer
>>> d = defer.Deferred()
>>> def errors(*args): raise Exception("i'm a bad function")
>>> def sad(*arg): print "this is not so good", arg
>>> def happy(*arg): print "this is good", arg
>>> d.addCallback(errors)
<Deferred at 0x106821f38>
>>> d.addCallbacks(happy, sad)
<Deferred at 0x106821f38>
>>> d.callback("hope")
this is not so good (<twisted.python.failure.Failure <type 'exceptions.Exception'>>,)
任何给定的&#34;阶段&#34;在一系列回调中,可以很容易地知道它是否遵循错误状态,无论是添加方式,作为addErrback()
的参数,还是addCallbacks()
的第二个参数,或者通过它的参数是Failure()
有关延迟链接的详细信息,请参阅:https://twistedmatrix.com/documents/14.0.1/core/howto/defer.html