0

我似乎误解了dataReceivedand的规则inlineCallbacks

更具体地说,当我这样做时:

def dataReceived(self, data):
    self.transport.write('ok')

我的协议确实发送了数据,但是当我这样做时:

@defer.inlineCallbacks
def dataReceived(self, data):
    a = yield True # this stands for some adbapi call actually
    self.transport.write('ok')

我什么也没收到,然后连接就关闭了。defer.returnValue 在这里也没有帮助,行为是相似的。

请解释。

4

1 回答 1

1

这只是一种预感,但我认为该dataReceived()函数不会返回任何东西,所以一个inlineCallbacks甚至返回/产生一个常规Deferred不会真正“做任何事情”。很抱歉模棱两可。您可能应该做的是在您的函数中创建Deferred并启动一个回调链。dataReceived()例如:

def dataReceived(self, data):
    # ...
    deferredObj = adbapi.runQuery('SELECT * FROM ...')    # this returns a Deferred
    deferredObj.addCallback(self.someCallback)            # exec self.someCallback() after query returns
    deferredObj.addErrback(self.anotherCallback, *args, **kwargs)

def someCallback(self, result):
    """
    When the db query returns, do something useful here
    """
    print(result)

链接

于 2016-05-27T14:07:38.833 回答