QtConcurrent может помочь. Попробуйте что-то вроде этого:
void TestObj::testFct(int someParam, const QJSValue &callback){
auto *watcher = new QFutureWatcher<int>(this);
QObject::connect(watcher, &QFutureWatcher<int>::finished, this, [this, watcher, callback]() {
int returnValue = watcher->result();
QJSValue cbCopy(callback);
QJSEngine *engine = qjsEngine(this);
cbCopy.call(QJSValueList { engine->toScriptValue(returnValue) });
watcher->deleteLater();
});
watcher->setFuture(QtConcurrent::run(this, &TestObj::testFctAsync, someParam));
}
Затем вызовите его из QML следующим образом:
function testCall() {
testObj.testFct(param, function(returnVal) {
console.log("Asynchronous function returned: " + returnVal);
})
}