Skip to content

Example Sleep async await

Stephen Quan edited this page Nov 16, 2022 · 2 revisions
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
    ListView {
        anchors.fill: parent 
        clip: true
        model: ListModel {
            id: _console
            function appendMsg(msg,col) {
                append({msg,col,ts:Date.now()});
            }
            function log(...params) {
                console.log(...params);
                appendMsg(params.join(" "),"black");
            }
            function error(...params) {
                console.log(...params);
                appendMsg(params.join(" "),"red");
            }
        }
        delegate: Frame {
            width: ListView.view.width - 20
            background: Rectangle {
                color: index & 1 ? "#eee" : "#ccc"
            }
            RowLayout {
                width: parent.width
                Text {
                    text: index + 1
                    color: "grey"
                }
                Text {
                    Layout.fillWidth: true
                    text: msg
                    color: col
                    wrapMode: Text.WrapAtWordBoundaryOrAnywhere
                }
                Text {
                    text: Qt.formatTime(new Date(ts),"h:mm:ss ap")
                    color: "grey"
                }
            }
        }
        ScrollBar.vertical: ScrollBar {
            width: 20
            policy: ScrollBar.AlwaysOn
        }
    }

    footer: Frame {
        RowLayout {
            width: parent.width
            Button {
                text: qsTr("Sleep async/await")
                onClicked: runAsync()
            }
        }
    }

    Component {
        id: sleepComponent
        Timer {
            property var resolve
            property var reject
            running: true
            repeat: false
            onTriggered: {
                stop();
                resolve();
                Qt.callLater(destroy);
            }
        }
    }

    function sleep(interval) {
        return new Promise(function (resolve, reject) {
            try {
                sleepComponent.createObject(this, { interval, resolve, reject } );
            } catch (err) {
                reject(err);
            }
        } );
    }

    function _asyncToGenerator(fn) {
        return function() {
            var self = this,
            args = arguments
            return new Promise(function(resolve, reject) {
                var gen = fn.apply(self, args)
                function _next(value) {
                    _asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value)
                }
                function _throw(err) {
                    _asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err)
                }
                _next(undefined)
            })
        }
    }

    function _asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
        try {
            var info = gen[key](arg)
            var value = info.value
        } catch (error) {
            reject(error)
            return
        }
        if (info.done) {
            resolve(value)
        } else {
            Promise.resolve(value).then(_next, _throw)
        }
    }

    function runAsync() {
        _asyncToGenerator( function*() {
            try {
                _console.clear();
                _console.log(1001);
                yield sleep(1000);
                _console.log(2001);
                yield sleep(1000);
                _console.log(3001);
                yield sleep(1000);
                _console.log(4001);
            } catch (err) {
                let scope = [ err.fileName, err.lineNumber ];
                if (err.columnNumber) scope.push(err.columnNumber);
                _console.error(scope.join(":") + ": " + err.message);
            }
        })();
    }
}

You can Try it Online!

Clone this wiki locally