考虑到:
function calculateDate(input) {
var result = something_this_takes_too_much_of_the_time * input;
}
Repeater {
count: 999
Label {
text: return (new Promise(resolve => calculateDate(somevalue) )).then(text => text)
}
}
就await函数在QML中不起作用而言,Promise是一个很好的选择,可以在calculateDate()计算时不阻塞GUI,并且文本应该慢慢地逐一填充
这至少是我对 Promise() 的理解,以前从未使用过它 不幸的是,这不起作用,它给了我错误:
Unable to assign QJSValue to QString
当我尝试时:
return (new Promise(resolve => calculateDate() )).then(text => text.toString())
return (new Promise(resolve => calculateDate().toString() )).then(text => text)
但是:
return (new Promise(resolve => calculateDate() )).then(text => text).toString()
仅将文本显示为“[object Promise]”——这当然是预期的
那么我该如何实现我想要的目标呢?
我们需要对calculateDate()进行一些澄清,因为如果它阻塞QML引擎线程,将其移动到Promises将不会解决任何性能问题。除此之外,这里有一些小更改,以使 Promise 语法适用于您的示例:
import QtQuick
import QtQuick.Controls
Page {
function calculateDate(input) {
return input;
}
ListView {
model: 99
anchors.fill: parent
delegate: Label {
text: "..."
Component.onCompleted:
Promise.resolve()
.then( () => calculateDate(index) )
.then( (t) => text = t )
}
}
}
总结一下,我改变的事情是:
calculateDate()
返回某些内容,您的实现不会返回任何内容Promise
逻辑移至 Component.onCompleted
,因为它是一个“程序”,无法以声明方式分配给 text
属性,它需要运行Promise.resolve
开始第一个,然后我可以用一个漂亮的缩进列出它下面的链。Repeater
,我更喜欢使用ListView
,它也可以让我滚动