待回复 QML 类型

一个表示异步结果的类。 更多...

导入语句import QtIvi 1.0
实例化 QIviPendingReply

属性

方法

详细描述

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对象提供了resultAvailablesuccess属性,以便在对象传递给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,监视器可能无效。


value : var

保存PendingReply的当前值

如果尚无结果可提供或回复失败,则返回默认构造的QVariant()。否则,返回一个QVariant,其中包含结果。


watcher : QIviPendingReplyWatcher*

保存PendingReply的监视器

注意:返回的QIviPendingReplyWatcher属于PendingReply及其所有副本。如果删除所有PendingReply的副本,则其QIviPendingReplyWatcher也会被删除。


方法文档

setFailed()

将回复标记为失败。

注意:结果只能设置一次,之后无法更改。

另请参阅 setSuccess.


setSuccess(var value)

将回复的结果设置为value并将回复标记为成功。

给定的值必须与回复类型相同或者可以转换为此类型。

注意:结果只能设置一次,之后无法更改。

另请参阅 setFailed.


then(success, failed)

设置在结果送达时调用的JavaScript回调。如果回复成功,则调用success回调,否则调用failed回调。

success回调可以接收回复值作为参数。

请参阅then方法的示例用法。

调用此函数多次将覆盖现有的回调。


©2020 The Qt Company Ltd. 包含在此处的文档贡献的版权归各自所有者所有。此处提供的文档是根据Free Software Foundation发布的GNU自由文档许可协议版本1.3的条款许可的。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。