suchen

Heim  >  Fragen und Antworten  >  Hauptteil

ES 2017: asynchrone Funktion vs. AsyncFunction-Objekt vs. asynchroner Funktionsausdruck

Ich habe gerade darüber gelesen async 函数 und einige ähnliche Funktionen für ES2017 entdeckt. Es sorgt für große Verwirrung und ich möchte nur fragen:

    Was ist der Unterschied zwischen
  1. async functionAsyncFunction (wird zum Erstellen einer asynchronen Funktion verwendet) und einem asynchronen Funktionsausdruck (der meiner Meinung nach nur eine weitere asynchrone Funktion ist)?
  2. Wann sollten Sie ein Format einem anderen vorziehen?

Höhepunkte aller Macken und Leistungen würden uns sehr freuen!

P粉459440991P粉459440991276 Tage vor424

Antworte allen(1)Ich werde antworten

  • P粉287726308

    P粉2877263082024-03-26 00:44:29

    在 Javascript 中创建函数有四种方法。在 Javascript 中还有四种创建异步函数的方法,它们是彼此精确的镜像。

    为了演示这是如何工作的,我使用了一个简单的 sleep 函数,在全局声明:

    function sleep(time) {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve();
            }, time);
        });
    }

    函数声明

    function speak() { return 'Hi'; }
    async function speak() { await sleep(1000); return 'Hi'; }

    这是声明函数的最简单方法。它可以声明一次并提升到当前函数作用域的顶部。

    函数声明和异步函数声明完全相同,只是 async 函数始终返回一个 Promise 并允许您使用 await

    函数表达式

    let speak = function() { return 'Hi'; } // anonymous function expression
    let speak = function speakFn() { return 'Hi'; } // named function expression
    
    let speak = async function() { await sleep(1000); return 'Hi'; } // anonymous asynchronous function expression
    let speak = async function speakFn() { await sleep(1000); return 'Hi'; } // named asynchronous function expression

    函数表达式看起来非常像函数声明。然而,它们并没有被提升到函数作用域的顶部。您可以根据需要多次重新定义它们。它们可以内联定义。它们可以是匿名的,也可以是命名的:如果它们被命名,那么该名称引用该函数范围内的函数。

    函数表达式和异步函数表达式完全相同,只是 async 函数始终返回一个 Promise 并允许您使用 await

    箭头函数

    let speak = word => 'Hi ' + word; // one parameter
    let speak = (word1, word2) => 'Hi ' + word1 + word2; // multiple parameters
    
    let speak = async word => { await sleep(1000); return 'Hi ' + word; } // one parameter
    let speak = async (word1, word2) => { await sleep(1000); return 'Hi ' + word1 + word2; } // multiple parameters

    箭头函数是一种快速而简短的方法定义一个函数,在 ES2015 (ES6) 中引入。它们在大多数方面与函数表达式等效,只是它们始终是匿名的,并且 this 的值始终是词法绑定的,即从外部作用域继承。

    箭头函数和异步箭头函数完全相同,只是 async 函数始终返回一个 Promise 并允许您使用 await。 (它们在上面的语句中略有不同,因为每个异步函数内部都有多个语句。这意味着这些语句需要包含在一个块 {} 中,并且 return 需要是显式的。这也是正确的超过一条语句长度的普通箭头函数。)

    函数构造函数

    let speak = new Function('word', 'return "Hi " + word;');
    let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')

    函数构造函数允许您使用字符串动态定义函数。请注意,它们始终在全局范围内运行,并且无法访问定义它们的范围。它们仅在极少数情况下有用。我个人不认为异步函数构造函数会有什么用处。 ES2017的作者同意我的观点,因为 AsyncFunction 不是全局对象,必须首先使用 const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor 获取。

    使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,只是 async 函数始终返回一个 Promise 并允许您使用 await。 (但你已经猜到了,对吧?)

    Antwort
    0
  • StornierenAntwort