动态创建异步功能

时间:2017-12-22 17:08:07

标签: javascript async-await

我想知道是否可以像这样动态创建异步函数:

new Function('await Promise.resolve()');

预计,之前的代码抛出:

Uncaught SyntaxError: await is only valid in async function

3 个答案:

答案 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()。我个人说不要使用它,除非你是编译器,因为:

  1. 很难看
  2. 字符串中的代码是sooo 90s ..而且它很难看
  3. 在js中动态创建函数只需要声明一个函数表达式:

    function functionMaker() {
        return function () {};
    }
    

    因此,动态创建异步函数只是:

    function asyncMaker() {
         return async function () {};
    }
    

答案 2 :(得分:-1)

使用内部返回的new Function()语法

&#13;
&#13;
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;
&#13;
&#13;