ES 2017: fungsi async lwn objek AsyncFunction lwn ekspresi fungsi async
P粉459440991
P粉459440991 2024-03-25 23:44:59
0
1
431

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粉459440991
P粉459440991

membalas semua(1)
P粉287726308

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 code> 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?)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan