-
Notifications
You must be signed in to change notification settings - Fork 5
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!