如何解决Javascript:如何等待eval函数?
我正在研究一个从Blockly Code Blocks绘制对象的项目。因此,将生成一个代码字符串,该代码字符串将在下面的函数中进行评估。在使用eval函数运行的代码中,所有创建的对象都存储在一个数组(对象)中。我的问题是,在alert(objects.length)与更新的对象数组一起使用之前,代码没有得到完全评估(因此,由于我之前已重置数组,因此它的警报值为零)。因此,警报应等待eval功能。您能帮我解决这个问题吗?
function paintFromCode() {
slideTo('konva_box');
setTimeout(function(){
deleteObjects();
let code = Blockly.JavaScript.workspaceToCode(workspace);
try {
code = "let t = 0;" + code;
eval(code);
} catch (e) {
alert(e);
}
layer.add(pospanel);
alert(objects.length);
},1000);
}
创建代码的函数的一部分:
let code = "setTimeout( function() {" +
"objects['" + text_identifier.toUpperCase() + "'] = new Konva.Circle({x: 50,y: 100,radius: 50,fill: '#00ff00'});" +
"layer.add(objects['" + text_identifier.toUpperCase() + "']);" +
"layer.draw();" +
"},speed * t);" +
"t = t + 1;";
return code;
解决方法
按照上面的代码编写的方式,似乎您可以控制layer
。运行代码块最后会调用layer.draw()
。您可以重新定义绘图以调用alert
语句。
// store original draw function
const orginalDraw = layer.draw;
layer.draw = function() {
originalDraw();
alert('draw has just been called');
}
try {
code = "let t = 0;" + code;
eval(code);
} catch (e) { alert(e); }
,
编辑我的初始响应不必要地复杂...假设setTimeout发生在Blockly Code Blocks返回的代码字符串中,建议拦截setTimeout
函数,并插入在那里进行超时处理。 (另一种选择是在Blockly Code Blocks代码字符串中搜索和替换setTimeout的条目,并用类似的自定义setTimeout函数代替,该函数也执行超时后处理。)
// Simulate ==> let code = Blockly.JavaScript.workspaceToCode(workspace);
// with an embedded setTimeout in the code to be eval-ed.
let code = `
setTimeout( () => alert('Blocky!'),2000);
`;
// Define the custom function to run once the setTimeout is complete.
var a = 0;
function postTimeout( x ) {
console.log( a );
a = x;
console.log( a );
alert( a );
}
// Finally,execute the "Blocky" code. But first,intercept the setTimeout
// function and afterwards reset it. Alternatively,one can search and
// replace 'setTimeout(' in the Blocky code,replacing with similar
// intercepting function.
const stf = setTimeout;
setTimeout = function(f,ms) {
return stf( () => { f(); postTimeout( 42 ) },ms)
};
eval( code );
setTimeout = stf;
运行此代码段后,alert('Blocky!')
将在2秒钟内使用setTimeout函数启动,以表示Blocky代码,然后紧接着,自定义postTimeout
函数将启动,以模拟
layer.add(pospanel);
alert(objects.length);
在问题中。
我已经将var a
包含在code
变量中,以达到超出“ Blocky” javascript范围的测试...
我遇到了同样的问题,这是我的处理方式
Array
(
[0] => 123
[1] => 1
[2] => 1.3
[3] => 1.3
[4] => 1.823
)
并且代码在 myArr1 中按函数拆分,并在我添加的每个函数之后
try {
eval("(async () => {"+code+"})()");
}
catch (e) {
alert(e);
}
这是我的waitfunction():
let wait='); await this.waitfunction(500);';
for (var i=0; i<myArr1.length-1;i++){
let tex=
myArr1[i].concat(wait);
b[i]=tex;
}
我知道这很长但它有效
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。