QML中的JS异步函数

时间:2017-07-18 05:29:28

标签: javascript qml

我想知道是否可以在QML中使用async function 像这样:

async function additem(clientName){
    myListModel.append({name:clientName});
}

而不是使用它:

function additem(clientName){
    myListModel.append({name:clientName});
}

我已经尝试了,我收到了语法错误:预期令牌:'`,找不到任何关于 QML支持JavaScript“async function”的文档。

任何想法为什么会这样?或者可能是否在JS中有任何其他方法可以在QML中使用异步?

注意:我想将数据附加到 ListModel ,我希望将其视为其进度我不知道我希望整个应用程序冻结,直到整个数据附加到模型。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

我回答了你发布到Qt论坛的这个问题的扩展版本的一部分,但没有解决异步部分。

从您在此处提供的示例中,您不清楚为什么要查找异步函数调用,因为您在此处发布的示例是一个基本上即时的函数,它不会#&# 39; t导致任何东西被锁定。

您能否详细解释一下您尝试做什么以及如何冻结用户界面?

如果问题是您正在执行

function additem(clientName){
    myListModel.append({name:clientName});
} 

在一个紧凑的循环中一千次,这就是为什么你的UI被冻结,我可以想到一些可能的解决方案。

一种是定期调用(在每个addItem之后或每10或20个addItem之后)ListView的forceLayout()方法 - http://doc.qt.io/qt-5/qml-qtquick-listview.html#forceLayout-method - 用于强制更新ListView以便您的UI反映模型的变化。

对于这种特殊情况,这可能是最简单的解决方案。

对于您可能需要异步函数的其他实例,您可以尝试使用具有短周期(例如20 ms)的Timer来执行任务子集,然后更新UI(或执行任何操作),然后执行另一批任务,等等。

在其他一些情况下,您可能会发现使用回调函数很有用,即调用函数并忘记它,但是传递一个回调函数,以便在它完成工作时执行。

答案 1 :(得分:-3)

QML有它!
使用WorkerScript解释here.:)