Я использую QJSEngine , я добавил глобальный объект:
QJSValue objGlobal = pobjScriptEng->globalObject();
pobjScriptEng
- указатель на экземпляр QJSEngine
.
У меня есть карта глобалов, определение типа карты:
std::map<QString, QString> mpGlobals;
Я перебираю карту глобалов, добавляя их в движок:
for( mpGlobals::iterator itr=rmpGlobals.begin(); itr!=rmpGlobals.end(); itr++ ) {
QString strName(itr->first);
if ( objGlobal.hasProperty(strName) == false ) {
QString strData(itr->second);
QJSValue result = pobjScriptEng->evaluate(strData);
objGlobal.setProperty(strName, result);
}
}
rmpGlobals
является ссылкой на карту глобалов.
У меня есть скрипт, который включает ссылку на глобал, глобал называется db
и является JSON объектом, который содержит:
{"db":"test","host":"localhost","usr":"root","pass":"123456"}
I добавлены некоторые журналы отладки в l oop, который вызывает setProperty
, и это то, что отображается в выходных данных приложения:
itr->first "db"
itr->second "{\"db\":\"test\",\"host\":\"localhost\",\"usr\":\"root\",\"pass\":\"resuocra\"}"
Синтаксическая ошибка исходит от JSON, но почему нет ничего не так с этим. Я сбросил result.toString()
на консоль, и он содержит:
SyntaxError: Ожидаемый токен `, '
Сценарий:
function test() {
try{
console.info("---------------");
console.info("test(), Line 4");
if ( db === undefined ) {
console.info("db is undefined");
return;
}
if ( typeof db === "object" ) {
var mbr;
console.info("test(), Line 7");
console.info(db);
console.info("test(), Line 9");
for( mbr in db ) {
console.info("test(), Line12");
console.info(mbr);
console.info("test(), Line14");
}
console.info("test(), Line 14");
}
console.info("test(), Line 16");
console.info("---------------");
} catch( e ) {
console.warn( "test() WARNING: " + e );
}
}
Когда Запустите мое приложение, и сценарий будет оценен. Я вижу следующее в «Выводе приложения»:
2020-04-08 08:21:36.320693+0100 XMLMPAM[3657:59571] [js] ---------------
2020-04-08 08:21:36.320732+0100 XMLMPAM[3657:59571] [js] test(), Line 4
2020-04-08 08:21:36.320747+0100 XMLMPAM[3657:59571] [js] test(), Line 7
2020-04-08 08:21:36.320762+0100 XMLMPAM[3657:59571] [js] SyntaxError: Expected token `,'
2020-04-08 08:21:36.320769+0100 XMLMPAM[3657:59571] [js] test(), Line 9
2020-04-08 08:21:36.320790+0100 XMLMPAM[3657:59571] [js] test(), Line 14
2020-04-08 08:21:36.320798+0100 XMLMPAM[3657:59571] [js] test(), Line 16
2020-04-08 08:21:36.320804+0100 XMLMPAM[3657:59571] [js] ---------------
Игнорировать все до того, как [js]
будет моей меткой времени и отладочной информацией, после того, как [js]
будет все вывод консоли.
Что такое:
SyntaxError: Ожидаемый токен `, '
Я не вижу ничего плохого в глобальном или скрипте.
Если я изменю скрипт и вставлю:
var db = {"db":"test","host":"localhost","usr":"root","pass":"123456"};
В качестве первой строки синтаксическая ошибка не отображается, и все в порядке, так что не так с глобальным, добавленным с помощью setProperty
?
Вот код, который добавляет глобал к карте:
void clsXMLnode::addGlobal(QString strGlobal) {
QStringList slstGlobal = strGlobal.split(clsXMLnode::msccGlobalDelimiter);
if ( slstGlobal.length() == clsXMLnode::mscintAssignmentParts ) {
QString strName(slstGlobal[clsXMLnode::mscintGlobalName].trimmed())
,strValue(slstGlobal[clsXMLnode::mscintGlobalValue].trimmed());
msmpGlobals.insert(std::make_pair(strName, strValue));
}
}
Некоторые определения:
clsXMLnode::msccGlobalDelimiter is "="
clsXMLnode::mscintAssignmentParts is 2
clsXMLnode::mscintGlobalName is 0
clsXMLnode::mscintGlobalValue is 1