我似乎误解了dataReceived
和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也没有帮助,行为也很相似。
请解释一下。
答案 0 :(得分: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)