2017-07-18 564 views
0

我想知道是否可以在QML中使用async function
像这样:QML中的JS异步函数

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

而不是使用这个的:

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

我已经尝试过了,我得到一个语法错误:预期的标记:“',但没有找到任何文件约QML支持JavaScript“异步功能”

任何想法为什么是这样的?或者如果有其他方法可以在JS中使用异步,可以在QML中使用?

注:我想将数据追加到我的的ListModel,我希望看到它作为其进展我不想整个应用程序冻结,直到整个数据附加到模型。

欣赏你的时间。

+0

@JaromandaX我没有在浏览器中看到这个错误,它在浏览器中可以正常工作,但不会在QML中正常工作。此外,错误是'预期的令牌:''就像我失踪**“:”** – Bear

+0

我的歉意。我误解你在问什么 –

+0

你可以看看[this](http://doc.qt.io/qt-5/threads-technologies.html#workerscript-threading-in-qml),但也可能[this] (https://github.com/benlau/quickpromise)。 – BaCaRoZzo

回答

-4

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

+0

感谢评论,正如Jaromandax和folibis所建议的那样,这是一种可能的解决方案,但由于它不加载QML库,因此引发了另一个问题。我更关注可以对javascript函数进行异步处理的方式,而不是在没有任何库的情况下单独运行它们,而是使用纯Javascript函数。 – Bear

+0

向下选民:每当答案有问题或错误或错误,你可以在评论中解释它。这将会导致帮助和清楚的事情。 –

+0

亲爱的@Bear'WorkerScript'可以用于简单的计算操作,而不在另一个线程中运行qml。但是,您可能能够将插件操作分为一些计算JS和QML部分。在这种情况下,您可以将计算JS部件迁移到单独的线程中。如果您发布示例代码片段,也许我可以帮助您。无论如何,如果你需要更多的权力和灵活性,你需要进入C++和'QThread'并在GUI线程中显示结果。 –

0

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

从你给这里的例子,它为什么你要找的异步函数调用,因为你张贴在这里是不会造成任何锁定了一个基本上是瞬时的函数的例子并不清楚。

你能解释一下更多关于你想要做什么以及它如何冻结UI?

如果问题是,你执行

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反映模型中的更改。

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

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

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

+0

感谢您的回复,是的,我在Qt论坛中给出了一个例子,还有您解释的**回调**是我想要的,但是回调是否可以这样做?你如何设置运行异步的回调?我尝试在JavaScript中,但它仍然等待,直到回调返回它的价值!这里是链接:https://jsfiddle.net/efvv45aw/ – Bear

+0

我不明白你的小提琴。它并没有延迟培根。要运行一个函数并稍后执行一个回调函数,你可以这样做https://jsfiddle.net/o2ts45dr/ – WaltPurvis

+1

另外,我假设你只是试图用这个例子来推理异步,因为QML的JavaScript引擎没有setTimeout函数,所以你不能使用它来创建回调。 – WaltPurvis