控制流量的eval()

时间:2017-01-11 15:12:07

标签: javascript eval

说您已将以下代码传递给eval()

function async(cb) {
    setTimeout(function(){ 
        console.log('hello'); 
        cb();
    },50)
}

async(function(){
    console.log('goodbye')
})

这将是使用eval()

的代码段
console.log('start')

try {
   var output = eval(code_from_above)
} catch(e) {
    console.log(e.message)
}

console.log('end')

最终的控制台输出是:

start
end
hello
goodbye

有没有办法向eval语句添加一个事件监听器,一旦异步代码完成就会触发该语句?这会导致以下控制台输出?

start
hello
goodbye
end

2 个答案:

答案 0 :(得分:0)

完成函数调用没有Javascript事件处理程序。但您可以将console.log('end');移至setTimeout函数的末尾:

function async(cb) {
    setTimeout(function(){ 
        console.log('hello'); 
        cb();
        console.log('end');
    },50);
}

async(function(){
    console.log('goodbye');
});

答案 1 :(得分:0)

你应该使用承诺。

var code_from_above = `
function async() {
  return new Promise(resolve => setTimeout(resolve, 50))
  .then(() => console.log('hello'));
}
async().then(() => console.log('goodbye'))`;

console.log('start')
try {
  var output = eval(code_from_above);
} catch(e) {
  console.log(e.message);
}
output.then(() => console.log('end'));