2016-01-11 129 views
0

我有一個管理模塊的應用程序調用異步:扭曲的遞延鏈接

  • 它請求延遲觸發本身
  • 追加定製的回調
  • 檢查返回的代碼,看看是否= CONTINUE,否則處理錯誤

這是返回延遲到主應​​用程序的代碼:

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) 

麻煩的是,迷上了每個函數收到包含回調參數一個參數(application.L_CONNECT)。

是否有可能實現這一點,而無需在每個函數調用中傳輸返回碼?

理想情況下,我想我的回調函數是這樣的:

def run_mods(self, level): 
    pass 

代替

def run_mods(self, code, level): 
    pass 

因爲code(Milter.ReturnCodes.CONTINUE)只需要在最後的鏈接

回答

0

區分成功或錯誤Deferred() s已經是它們內置的一項功能。

>>> 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'>>,) 

在回調的鏈中的任何給定的「階段」可以很容易地知道,如果它的以下內容的錯誤狀態,或者通過它是如何加入,作爲參數addErrback(),或第二個參數addCallbacks(),或憑藉它的論點是的Failure()

實例更多關於推遲鏈接見:https://twistedmatrix.com/documents/14.0.1/core/howto/defer.html

+0

謝謝你,這確實是我能夠做到的,但如果更一般地,我鏈2推遲,不想從第一個發送給孩子的結果?這可能嗎 ? – kitensei

+1

你可以設置一個回調函數來放棄一些參數,即:'d.addCallback(lambda a,b:b)' – SingleNegationElimination