Promise() 作为标签中的文本

问题描述 投票:0回答:1

考虑到:

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]”——这当然是预期的

那么我该如何实现我想要的目标呢?

javascript qt qml es6-promise qt6
1个回答
0
投票

我们需要对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 的更改,我通常以
    Promise.resolve
    开始第一个,然后我可以用一个漂亮的缩进列出它下面的链。
  • 而不是
    Repeater
    ,我更喜欢使用
    ListView
    ,它也可以让我滚动
© www.soinside.com 2019 - 2024. All rights reserved.