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;
                  

                  }

我知道这很长但它有效