首页 > 解决方案 > Javascript:如何等待评估函数?

问题描述

我正在开发一个从 Blockly 代码块中绘制对象的项目。因此生成一个代码字符串,在下面的函数中进行评估。在使用 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;

标签: javascriptasync-awaiteval

解决方案


我有同样的问题,这就是我如何处理它

try { 
       eval("(async () => {"+code+"})()");

        }
catch (e) {
                       alert(e);
                          }

并且代码在 myArr1 中按功能拆分,并且在我添加的每个功能之后

   let wait='); await this.waitfunction(500);';
                         for (var i=0; i<myArr1.length-1;i++){

                        let tex=
                      myArr1[i].concat(wait);
                  b[i]=tex;
                  

                  }

这是我的等待函数():

waitfunction(ms){

return new Promise(resolve => {
  setTimeout(()=>resolve(''),ms)
   });
}

我知道这很长,但它有效


推荐阅读