说您已将以下代码传递给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
答案 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'));