0

と のルールを誤解しているよう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 も役に立ちません。動作はまったく同じです。

親切に説明してください。

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 に答える