Details
-
Suggestion
-
Resolution: Unresolved
-
P3: Somewhat important
-
None
Description
Qt Script lets us do things like this; it would be helpful to have a similar ability in QJSEngine:
QScriptValue ScriptContext::scriptAbortAfter(QScriptContext* ctx, QScriptEngine& eng) { try { if (ctx->argumentCount() < 2) throw Exception(L"abortAfter(timeout, callback[, callback parameters...]) takes at least 2 parameters."); if (!ctx->argument(0).isNumber()) throw Exception(L"Parameter 1 (timeout) must be an integer specifying the timeout in milliseconds."); if (!ctx->argument(1).isFunction()) throw Exception(L"Parameter 2 (callback) must be a function."); int timeout = ctx->argument(0).toInteger(); QScriptValue function = ctx->argument(1); QScriptValueList callbackParameters; for (int i = 2; i < ctx->argumentCount(); ++i) callbackParameters.push_back(ctx->argument(i)); auto future = std::async(std::launch::async, [&]() { QScriptValue value; value = function.call(ctx->thisObject(), callbackParameters); return value; }); } ... }
Side note
For this particular example, an alternative solution might be to add support for ECMAScript 2017. Then, this example C++ code can be replaced by native JS async functions