我想知道是否可以像这样动态创建异步函数:
new Function('await Promise.resolve()');
预计,之前的代码抛出:
Uncaught SyntaxError: await is only valid in async function
答案 0 :(得分:4)
是的,您可以使用(非全局的)AsyncFunction构造函数以类似于<script language="JavaScript">
window.onload = function () {
document.addEventListener("contextmenu", function (e) {
e.preventDefault();
}, false);
document.addEventListener("keydown", function (e) {
//document.onkeydown = function(e) {
// "I" key
if (e.ctrlKey && e.shiftKey && e.keyCode == 73) {
disabledEvent(e);
}
// "J" key
if (e.ctrlKey && e.shiftKey && e.keyCode == 74) {
disabledEvent(e);
}
// "S" key + macOS
if (e.keyCode == 83 && (navigator.platform.match("Mac") ?
e.metaKey : e.ctrlKey)) {
disabledEvent(e);
}
// "U" key
if (e.ctrlKey && e.keyCode == 85) {
disabledEvent(e);
}
// "F12" key
if (event.keyCode == 123) {
disabledEvent(e);
}
}, false);
function disabledEvent(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else if (window.event) {
window.event.cancelBubble = true;
}
e.preventDefault();
return false;
}
}
</script>
</head>
<body oncontextmenu="return false">
<body>
的工作方式来动态创建异步函数。
这是一个简单的例子:
new Function(...)
请记住,您可以在动态创建的异步函数中使用const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
function createAsync(){
return new AsyncFunction('a', `return new Promise((resolve) => {
setTimeout(() => {resolve(a)}, 1000)
});`);
}
let asyncFn = createAsync();
asyncFn(1).then(/* chain the promise */);
// or inside some async function
async function myFunction(){
await asyncFn(1);
}
:)
注意:await
构造器不是不是全局(例如AsyncFunction
),唯一引用它的方法是通过{{ 1}}实例,如MDN文档中所述。
答案 1 :(得分:2)
不要使用new Function()
。我个人说不要使用它,除非你是编译器,因为:
在js中动态创建函数只需要声明一个函数表达式:
function functionMaker() {
return function () {};
}
因此,动态创建异步函数只是:
function asyncMaker() {
return async function () {};
}
答案 2 :(得分:-1)
使用内部返回的new Function()
语法
async function foo() {
return await new Promise(next => {
setTimeout(()=> next('hello there!!'), 3000)
})
}
var new_async = new Function(`return ${foo.toString()}`)()
console.log(new_async.toString())
&#13;