Qt5是不支持javascript中的async/await函数的,幸运的是从Qt5.12版本之后提供了Promise和Generator及yield的函数,我们可以使用这3个函数进行特殊处理一下,实现类似async/await的效果,以下是一个简单的例子。
function assertEqual(x, y) {
return new Promise(function(resolve, reject) {
if(x === y) {
Qt.callLater(resolve, "Yes, it's equal.")
}else{
Qt.callLater(reject, "No, it's not equal.")
}
});
}
asyncGenerator(function *(){
for(let i = 0; i < 10; i++) {
yield assertEqual(x, y).then(function(result){
Playbook.log("assertResult.then", result)
}).catch(function(err){
Playbook.log("assertResult.catch", err)
})
}
})()
asyncGenerator等同于async,而yield等同于await,但yield的对象必须是Promise的异步对象,这样实现了async/await的效果。
其中asyncGenerator函数是由框架提供,开发者可直接使用,其具体源码地址:https://github.com/aoyiduo/woterm/blob/main/woterm/js/async.js,截取如下:
function asyncGenerator(fn) {
return function() {
var thiz = this,
args = arguments
return new Promise(function(resolve, reject) {
var gen = fn.apply(thiz, args)
function _next(value) {
step("next", value)
}
function _throw(err) {
step("throw", err)
}
function step(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)
}
}
_next(undefined)
})
}
}