待回复 QML 类型
一个表示异步结果的类。 更多...
导入语句 | import QtIvi 1.0 |
实例化 | QIviPendingReply |
属性
- resultAvailable : bool
- success : bool
- valid : bool
- value : var
- watcher : QIviPendingReplyWatcher*
方法
- setFailed()
- setSuccess(var value)
- then(success, failed)
详细描述
PendingReply 是提供异步结果的一种方式。它可以作为异步函数的返回值。
QML API 与 JavaScript Promises 非常相似。
本文档展示了如何在 QML 中使用 PendingReply,以及如何在异步结果就绪后执行代码。
注意:不支持从 QML 创建 PendingReply。该对象应从 C++ 创建,并将作为结果返回到 QML。有关如何从 C++ 使用它的更多信息,请参阅 QIviPendingReply 文档。
当从 C++ 创建 PendingReply 时,它尚未设置结果,且 resultAvailable 属性为 false
。对于待回复结果,只能设置一次,并且它表示一个失败(setFailed)或成功(setSuccess)调用。这可以通过 success 属性进行检查。实际结果可通过 value 属性获取,如果未提供结果或回复失败,该属性返回未定义。
使用 PendingReply
如上所述,PendingReply 应用于 C++ 中异步操作的返回值。为了通知回复结果何时可用于,有两种方法
the then 方法
类似于 JavaScript Promise,PendingReply 可用于 then,这意味着它提供了一个 then 方法。此方法可用于添加回调,当回复成功或失败时执行这些回调。
import QtQuick 2.0 import QtIvi 1.0 Text { id: root text: "not ready" Component.onCompleted: { var asyncReply = TestObject.asyncFunction(); asyncReply.then(function(value) { root.text = "reply ready: " + value }, function() { root.text = "reply failed" }) } }
此简单的 QML 片段调用 C++ 函数 TestObject::asyncFunction(),该函数返回一个 PendingReply。有关如何编写此类函数以及如何从 C++ 使用 PendingReply 的信息,请参阅 C++ 部分。
then 方法用于注册两个回调。第一个回调是结果回调,它接受回复值作为参数。这将相应地更新文本元素。第二个参数是失败回调,它不接受任何参数,因为没有有效的回复值。
如果失败状态不感兴趣,也可以不为此添加任何回调,例如:
asyncReply.then(function(value) { root.text = "reply ready: " + value })
以类似的方式,可以通过传递 undefined 作为第一个参数来仅注册失败回调。
asyncReply.then(undefined, function() { root.text = "reply failed" })
同步结果
在API中使用PendingReply对象时,相应的函数不能立即提供结果。但对于输入验证,函数可以立即返回错误状态。为此,PendingReply对象提供了resultAvailable和success属性,以便在对象传递给QML时检查。
在QML中对每个PendingReply使用情况进行检查可能很麻烦,并产生大量模板代码。由于这个原因,PendingReply与JavaScript Promise类似,即使结果已经可用,仍然会执行回调。
信号和槽
尽管then方法是QML推荐的方式,但PendingReply也提供了信号。由于为了使PendingReply尽可能轻量级,它使用Q_GADGET而且无法直接提供信号,但它通过QIviPendingReplyWatcher类提供。可以通过使用watcher属性来访问QIviPendingReplyWatcher。
注意: QIviPendingReplyWatcher属于PendingReply。将watcher保存在PendingReply之外是不安全的,因为一旦所有PendingReply对象的副本都被销毁,它就会被销毁。
属性文档
resultAvailable : bool |
保存是否有结果已被设置
此属性在用setSuccess()或setFailed()设置结果后变为true
。
success : bool |
保存回复是否成功
如果通过调用setSuccess()设置了有效的结果,则此属性为true
。
valid : bool |
保存PendingReply是否有效
如果使用模板类QIviPendingReply之外手动创建PendingReply,监视器可能无效。
保存PendingReply的监视器
注意:返回的QIviPendingReplyWatcher属于PendingReply及其所有副本。如果删除所有PendingReply的副本,则其QIviPendingReplyWatcher也会被删除。
方法文档
setSuccess(var value) |
设置在结果送达时调用的JavaScript回调。如果回复成功,则调用success回调,否则调用failed回调。
success回调可以接收回复值作为参数。
请参阅此then方法的示例用法。
调用此函数多次将覆盖现有的回调。
©2020 The Qt Company Ltd. 包含在此处的文档贡献的版权归各自所有者所有。此处提供的文档是根据Free Software Foundation发布的GNU自由文档许可协议版本1.3的条款许可的。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。