- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要当用户单击一个按钮时,该按钮会触发回调并向她传递一些参数,每次参数都将不同。
我看过文档,但似乎缺少循环部分:
Looping
A common form of dependency is needing to perform the asynchronous operation all over again. The canonical example of this an HTTP redirect: when the callback for a deferred from a page request is returned, it could be the result, or it could be an empty body with the Location HTTP header set, in which case you simply perform the operation over again.
[ here is the HTTP redirect example. It also should have pictures. ]
if happen this:
try:
print "I'm here!"
myobjectx.addCallback(test,x,y,z)
myobjectx.callback()
except:
...
1) create the myobject that do nothing for now
2) when an event is fired prepare the callback for the myobject e execute it
3) how can I redo the callback next time the event happen again?
MAINPROCESS
MODBUSLIB
myobjectx = MODBUSLIB.protocol.ClientCreator(reactor, ModbusClientProtocol
).connectTCP("localhost", Defaults.Port)
if ('Gigiisclicked' in existkeys):
myobjectx.addCallback(beginAsynchronousTest)
myobjectx.callback(beginAsynchronousTest)
print "executed"
最佳答案
我认为这里的一个误解是有关如何使用Deferred
实例的。
您应该将Deferred
视为具有两种不同的(尽管高度相关)用途。
一种用途是能够从知道如何注意到事件已发生的某些代码中发布事件到可能对知道该事件已发生有兴趣的其他代码中。
此用法的一个示例是ClientCreator.connectTCP
:此API的实现知道TCP连接尝试成功(或失败)的时间,并使用Deferred
将此信息发布到其他代码。像这样使用Deferred
的代码实际上是实例化Deferred
的代码(例如d = Deferred()
),后来又使用Deferred.callback
和Deferred.errback
。Deferred
的另一种用法是允许对发生的事件感兴趣的代码了解这些事件已发生。例如,您的该应用程序需要TCP连接以交换数据-但需要等待一个正在建立的应用程序才能继续进行。像这样使用Deferred
的代码是使用Deferred.addCallback
或Deferred.addErrback
的代码(在最新版本的Twisted中也为Deferred.cancel
)。Deferred.addCallback
是用于指定Deferred
最终获得结果时要运行什么代码的API。Deferred.callback
是用于将结果提供给Deferred
的API。而且,重要的是,只能给Deferred
一个结果。每个Deferred
实例代表单个操作的完成或单个事件的发生。
有某些例外情况和其他一些细微之处,但一个很好的经验法则是,如果您的代码未实例化Deferred
,则您的代码不应使用其callback
(或errback
)方法。对于创建Deferred
的任何代码,调用其中之一是工作。
鉴于此,我希望很明显在此代码中使用Deferred
API时需要解决一些问题:
myobjectx = MODBUSLIB.protocol.ClientCreator(reactor, ModbusClientProtocol
).connectTCP("localhost", Defaults.Port)
...
if ('Gigiisclicked' in existkeys):
myobjectx.addCallback(beginAsynchronousTest)
myobjectx.callback(beginAsynchronousTest)
print "executed"
myobjectx.callback
。这是
ClientCreator.connectTCP
的工作(最重要的是,
beginAsynchronousTest
可能没有意义)。
Deferred
最终为您创建的
ModbusClientProtocol
实例的方法。在链接到的示例中,请注意,
ClientCreator.connectTCP
被定义为接受一个名为
beginAsynchronousTest
的参数。
client
传递给
beginAsynchronousTest
返回的
addCallback
的
Deferred
方法,这意味着将使用初始化
ClientCreator.connectTCP
的协议实例(在这种情况下为
ClientCreator
)调用该方法。 。通过实施
ModbusClientProtocol
给
beginAsynchronousTest
提供结果后,将立即调用
Deferred
-换句话说,建立连接后将立即调用它。建立TCP连接需要花费一些时间,因为它涉及到通过任意网络链接与任意其他计算机交换数据-无法确定这些资源将花费多长时间来完成其部分连接设置。
ClientCreator
后,您将建立连接-由传递给它的
beginAsynchronousTest
实例表示。这是程序中可以开始执行多项操作(例如,每次单击按钮时执行的操作)的要点。
ModbusClientProtocol
(在上面的代码片段中称为
Deferred
)已经完成,不再有用或有趣,因此您将不再使用它。
myobjectx
的方法(
ModbusClientProtocol
或
read_coils
或您要执行的其他任何操作)。这些方法中的每一个都可能返回代表该特定操作结果的全新
write_coil
。您需要对它们使用
Deferred
以便了解其结果。
addCallback
的正文中,则如何执行此操作非常简单:
reading = client.read_coils(1, 1)
beginAsynchronousTest
的正文中。取而代之的是,您可能在程序中的其他任何地方都有一个事件处理程序,该事件处理程序在每次按下按钮时都会被调用。幸运的是,处理这种情况并不复杂。
beginAsynchronousTest
主体内,您可以引用它-
beginAsynchronousTest
参数。您也可以使该引用对程序的其他部分可用:在由程序的必要部分共享的对象上设置属性是一种常见的,相当好的方法。
class ButtonModbusSomething(object):
def __init__(self):
self.client = None
def connect(self):
creator = MODBUSLIB.protocol.ClientCreator(reactor, ModbusClientProtocol)
connecting = creator.connectTCP("localhost", Defaults.Port)
connecting.addCallback(self._connected)
connecting.addErrback(log.err)
def _connected(self, client):
self.client = client
def buttonClicked(self, existkeys):
if self.client is not None:
if "Gigiisclicked" in existkeys:
self.client.read_coil(1, 1)
client
的
client
属性是如何以
ButtonModbusSomething
开头的,以及
None
需要如何检查这种情况。如上所述,建立连接可能要花费一些时间,并且唯一知道等待
buttonClicked
的时间的方法是等待调用。此检查可确保如果在连接存在之前单击了按钮,则事件将被忽略(您可能希望更好地处理该事件-例如,通过从处于禁用状态的用户界面开始,然后仅在连接已建立)。
_connected
属性不再有用。它仍然是对已连接的
client
的引用,但是由于该协议实例不再具有连接,因此很难做任何有用的事情。当连接断开或至少开始再次忽略按钮按下时,您可能需要重新禁用用户界面。
ModbusClientProtocol
实际上来自
ClientCreator
而不是
twisted.internet.protocol
。
关于python - 扭曲矩阵回调调用一次又一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19223972/
我是一名优秀的程序员,十分优秀!