Javascript QML中的JS异步函数

Javascript QML中的JS异步函数,javascript,qml,Javascript,Qml,我想知道是否可以在QML中使用 像这样: async function additem(clientName){ myListModel.append({name:clientName}); } 而不是使用这个: function additem(clientName){ myListModel.append({name:clientName}); } 我已经尝试过了,但我得到了一个语法错误:预期的标记:`,并且找不到任何关于QML支持JavaScript“异步函数”的文档

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

async function additem(clientName){
    myListModel.append({name:clientName});
}
而不是使用这个:

function additem(clientName){
    myListModel.append({name:clientName});
}
我已经尝试过了,但我得到了一个语法错误:预期的标记:`,并且找不到任何关于QML支持JavaScript“异步函数”的文档

知道为什么吗?或者,如果在JS中有其他可以在QML中使用的异步方式的话

注意:我想将数据附加到我的列表模型中,我想将其视为其进度我不希望整个应用程序冻结,直到将整个数据附加到模型中

感谢您的时间。

QML拥有它
按说明使用
WorkerScript

更新:链接已更新

QML拥有它
按说明使用
WorkerScript


更新:链接更新

我回答了您在Qt论坛上发布的这个问题的扩展版本的一部分,但没有提到异步部分

从您在这里给出的示例来看,不清楚为什么要寻找异步函数调用,因为您在这里发布的示例本质上是一个瞬时函数,不会导致任何锁定

你能再解释一下你想做什么,以及它如何冻结用户界面吗

如果问题是你正在执行

function additem(clientName){
    myListModel.append({name:clientName});
} 
在一个紧密的循环中进行了一千次,这就是为什么您的UI被冻结的原因,我可以想出一些可能的解决方案

一种是定期调用(在每个addItem之后或在每个10或20个addItem之后)ListView的forceLayout()方法,该方法旨在强制更新ListView,以便UI反映模型中的更改

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

对于可能需要异步函数的其他实例,您可以尝试使用一个短时间(比如说20毫秒)的计时器来执行任务子集,然后更新UI(或执行任何操作),然后执行另一批任务,依此类推


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

我回答了您在Qt论坛上发布的这个问题的扩展版本的一部分,但没有提到异步部分

从您在这里给出的示例来看,不清楚为什么要寻找异步函数调用,因为您在这里发布的示例本质上是一个瞬时函数,不会导致任何锁定

你能再解释一下你想做什么,以及它如何冻结用户界面吗

如果问题是你正在执行

function additem(clientName){
    myListModel.append({name:clientName});
} 
在一个紧密的循环中进行了一千次,这就是为什么您的UI被冻结的原因,我可以想出一些可能的解决方案

一种是定期调用(在每个addItem之后或在每个10或20个addItem之后)ListView的forceLayout()方法,该方法旨在强制更新ListView,以便UI反映模型中的更改

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

对于可能需要异步函数的其他实例,您可以尝试使用一个短时间(比如说20毫秒)的计时器来执行任务子集,然后更新UI(或执行任何操作),然后执行另一批任务,依此类推


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

@JaromandaX我在浏览器中没有收到该错误,它在浏览器中可以正常工作,但在QML中不会。另外,错误是
预期标记:'
就像我失踪了一样:““我的道歉。我误解了您的提问。您可以查看[this](),但也可能查看[this]()。
WorkerScript
可以很容易地做到这一点,您可以将
QML
模块导入
JS
文件。看看这篇文章。@JaromandaX我在浏览器中没有看到这个错误,它在浏览器中可以正常工作,但在QML中不行。另外,错误是
预期标记:'
就像我失踪了一样:““我的道歉。我误解了您的提问。您可以查看[this](),但也可能查看[this]()。
WorkerScript
可以很容易地做到这一点,您可以将
QML
模块导入
JS
文件。请看这篇文章。感谢您的评论,正如Jaromandax和folibis所建议的,这是一种可能的解决方案,但由于它不加载QML库,因此它会引发另一个问题。我更关注的是如何异步运行javascript函数,而不是在没有任何库的情况下单独运行它们,而只运行纯javascript函数。这将导致帮助和澄清。Dear@Bear
WorkerScript
可用于不在其他线程中运行qml的简单计算操作。但是,您可以将插件操作划分为一些计算JS和QML部分。在这种情况下,您可以将计算JS部分迁移到单独的线程中。如果您发布一个示例代码片段,也许我可以帮助您。不管怎样,如果你需要更多的灵活性和灵活性,你需要进入C++和 QTox,并在GUI线程中显示结果。S.M.Mousavi,谢谢你的回复,我不太熟悉多线程,老实说,我最近知道了,所以我在看QT文档所给出的例子。但是如果我遇到任何困难,我会提供一个示例代码,顺便说一下,我不能用C++来开发我的插件。第三方应用程序不支持C++库。感谢评论,正如Jaromandax和FulbIs所建议的,这是一种可能的解决方案,但是它又引发了另一个问题,因为它不加载QML库。我更关注的是如何实现javascript函数的异步