cari

Rumah  >  Soal Jawab  >  teks badan

ES 2017: fungsi async lwn objek AsyncFunction lwn ekspresi fungsi async

Saya baru sahaja membaca tentang async 函数 dan menemui beberapa ciri serupa untuk ES2017. Ia menyebabkan banyak kekeliruan dan saya hanya ingin bertanya:

    Apakah perbezaan antara
  1. async functionAsyncFunction (digunakan untuk mencipta fungsi async) dan ungkapan fungsi async (yang saya fikir hanyalah satu lagi fungsi async)?
  2. Bilakah anda harus menggunakan satu format berbanding format yang lain?

Sorotan keanehan dan persembahan semua orang akan sangat dihargai!

P粉459440991P粉459440991242 hari yang lalu387

membalas semua(1)saya akan balas

  • P粉287726308

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

    Terdapat empat cara untuk mencipta fungsi dalam Javascript. Terdapat juga empat cara untuk mencipta fungsi tak segerak dalam Javascript, yang merupakan cermin tepat antara satu sama lain.

    Untuk menunjukkan cara ini berfungsi, saya menggunakan fungsi sleep mudah, diisytiharkan secara global:

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

    Pengisytiharan fungsi

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

    Ini adalah cara paling mudah untuk mengisytiharkan fungsi. Ia boleh diisytiharkan sekali dan dinaikkan ke bahagian atas skop fungsi semasa.

    Pengisytiharan fungsi adalah sama seperti pengisytiharan fungsi async, kecuali async 函数始终返回一个 Promise 并允许您使用 await.

    Ekspresi fungsi

    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

    Ekspresi fungsi kelihatan sangat mirip dengan pengisytiharan fungsi. Walau bagaimanapun, mereka tidak dinaikkan pangkat ke bahagian atas skop fungsi. Anda boleh mentakrifkan semula mereka seberapa banyak yang diperlukan. Mereka boleh ditakrifkan sebaris. Mereka boleh tanpa nama atau dinamakan: jika mereka dinamakan, nama itu merujuk kepada fungsi dalam skop fungsi itu.

    Ekspresi fungsi adalah betul-betul sama dengan ungkapan fungsi tak segerak, kecuali async 函数始终返回一个 Promise 并允许您使用 await.

    Fungsi anak panah

    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

    Fungsi anak panah ialah cara cepat dan singkat untuk mentakrifkan fungsi, yang diperkenalkan dalam ES2015 (ES6). Ia bersamaan dengan ungkapan fungsi dalam kebanyakan aspek, kecuali ia sentiasa tanpa nama dan nilai this sentiasa terikat secara leksikal, iaitu diwarisi daripada skop luar.

    Fungsi anak panah adalah sama seperti fungsi anak panah async, cuma async 函数始终返回一个 Promise 并允许您使用 await。 (它们在上面的语句中略有不同,因为每个异步函数内部都有多个语句。这意味着这些语句需要包含在一个块 {} 中,并且 return. (Ia sedikit berbeza dalam penyataan di atas kerana terdapat berbilang penyataan di dalam setiap fungsi async. Ini bermakna penyataan ini perlu disertakan dalam blok {} dan keperluan return untuk menjadi eksplisit. Ini juga benar untuk fungsi anak panah biasa yang lebih panjang daripada satu pernyataan.)

    Pembina fungsi

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

    Pembina fungsi membolehkan anda menentukan fungsi secara dinamik menggunakan rentetan. Ambil perhatian bahawa mereka sentiasa berjalan dalam skop global dan tidak mempunyai akses kepada skop yang ditakrifkan. Mereka hanya berguna dalam situasi yang jarang berlaku. Secara peribadi saya tidak fikir pembina fungsi async akan berguna. Pengarang ES2017 bersetuju dengan saya kerana AsyncFunction 不是全局对象,必须首先使用 const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor mendapat.

    Fungsi yang dibuat menggunakan pembina fungsi adalah sama seperti fungsi yang dibuat menggunakan pembina fungsi tanpa nama, kecuali async 函数始终返回一个 Promise 并允许您使用 await. (Tetapi anda sudah meneka kan?)

    balas
    0
  • Batalbalas