2017-07-18 49 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