待回复 QML 类型

表示异步结果的程序对象。 更多信息...

导入语句import QtInterfaceFramework
实例化 QIfPendingReply

属性

方法

详细描述

待回复是提供异步结果的一种方法。它可以被用作异步函数的返回值。

QML API 与 JavaScript Promises 非常相似。

本文档展示了如何在 QML 中使用待回复,以及如何在异步结果准备好后执行代码。

注意:不支持在 QML 中创建待回复对象。该对象应从 C++ 创建并将其作为结果返回到 QML。有关从 C++ 使用它的更多信息,请参见 QIfPendingReply 文档

从 C++ 创建待回复时,它还没有设置结果,并且 resultAvailable 属性为 false。待回复的结果只能设置一次,它可以表示失败(setFailed)或成功(setSuccess)调用。这可以通过 success 属性来检查。实际结果可以通过 value 属性获得,如果没有结果可用或回复失败,则返回 undefined。

使用待回复

如上所述,待回复应作为 C++ 中执行的操作的返回值使用。要通知回复结果何时可用,有两种方式

然后方法

与 JavaScript Promise 类似,待回复是可用的,这意味着它提供了一个 then 方法。此方法可用于添加当回复成功或失败时执行的回调。

import QtQuick
import QtInterfaceFramework

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++部分了解如何编写此类函数以及如何从C++使用PendingReply。

使用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,不能直接提供信号,但通过QIfPendingReplyWatcher类提供信号。可以通过watcher属性访问QIfPendingReplyWatcher

注意: QIfPendingReplyWatcher 由PendingReply拥有。在PendingReply之外保存监听器是不安全的,因为它在所有此PendingReply对象的副本被销毁后被销毁。

属性文档

resultAvailable : bool [只读]

保留是否已设置结果

使用setSuccess()或setFailed()设置结果后,此属性为true


success : bool [只读]

保留回复是否成功

如果通过调用setSuccess()设置回复,此属性为true


valid : bool [只读]

保留PendingReply是否有效

如果使用模板类QIfPendingReply以外的模板创建PendingReply,监听器可以无效。


value : var [只读]

保留PendingReply的当前值

如果尚未有结果可用或响应失败,则返回默认构造的QVariant()。否则,返回一个包含结果的QVariant。


watcher : QIfPendingReplyWatcher* [只读]

保存对PendingReply的监视者。

注意:返回的QIfPendingReplyWatcher由PendingReply及其所有副本拥有。如果所有PendingReply副本都被删除,则其QIfPendingReplyWatcher也将被删除。


方法文档

setFailed()

将响应标记为失败。

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

另请参阅setSuccess


setSuccess(var value)

将响应的结果设置为value并将其标记为成功。

给定值需要与响应的类型相同或可转换为该类型。

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

另请参阅setFailed


then(success, failed)

设置JavaScript回调,一旦传递结果就调用。如果响应成功,将调用success回调,否则调用failed回调。

success回调可以接受响应值作为参数。

请参阅The then method的示例用法。

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


© 2024 Qt公司有限公司。 herein包括的文档贡献是各自所有者的版权。提供的文档是根据GNU自由文档许可第1.3版(由自由软件基金会发布)的条款许可的。Qt及其相应商标是Qt公司有限公司在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。