1. Home
  2. Docs
  3. 使用手册
  4. 运维剧本
  5. 命令列表
  6. async/await函数

async/await函数

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)
        })
    }
}