Janji dalam JavaScript hanyalah tugas yang belum selesai. Ia seperti memesan makanan di restoran: apabila anda membuat pesanan anda, pelayan membuat janji untuk membawa makanan yang anda pesan. Setelah makanan dibawa ke meja, janji telah ditunaikan. Jika makanan yang anda pesan tidak boleh dihidangkan kerana dapur kehabisan bahan utama, maka anda boleh menangkap hidangan di tempat lain.
Ini semua tak segerak. Apabila anda duduk di meja, anda mungkin berbual dengan rakan atau menatal pada telefon anda. Anda jeda apa yang anda lakukan supaya anda boleh memberikan pesanan anda kepada pelayan, kemudian kembali melakukan perkara yang anda lakukan sebelum ini.
Janji JavaScript berfungsi sama. Memandangkan JavaScript adalah satu benang, janji membenarkan enjin JavaScript beralih kepada tugas lain sementara ia menunggu operasi tertentu selesai.
Janji ialah jenis objek tertentu. Semua janji bermula dalam keadaan tertunda. Fungsi panggil balik dalam janji, dipanggil pelaksana, mentakrifkan masa untuk menyelesaikan atau menolak janji.
const order = new Promise((resolve, reject) => { if ( foodDelivered) { resolve('eat food'); } else { reject('find another restaurant'); } })
order // wait for the asynchronous value to be fulfilled .then(value => console.log(value)) // handle rejection .catch(error => console.log(error)) .finally(() => console.log('all done'));
fetch ialah fungsi terbina dalam dalam JavaScript yang mengembalikan janji. Ia membuat permintaan HTTP dan membolehkan anda mengendalikan respons secara tidak segerak dengan .then() dan .catch().
fetch('url') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.log(error)) .finally(() => console.log('all done');
tindanan panggilan mengurus tugasan segerak, menjejaki tertib yang mereka laksanakan. Ini agak mudah: tugasan dilaksanakan mengikut susunan yang ditulis.
Walau bagaimanapun, tugasan tak segerak dikendalikan oleh gelung acara. Gelung peristiwa membenarkan kod tak segerak dilaksanakan dalam keadaan tidak teratur, membenarkan enjin JavaScript terus bekerja pada tugas lain tanpa menunggu.
Bagaimana ini akan dilaksanakan?
console.log("console log first!"); setTimeout( _ => console.log("set timeout second!"), 0); Promise.resolve().then(() => console.log("promise third")); console.log("console log last!!!");
Anda mungkin menjangkakan ia akan dilaksanakan mengikut tertib, tetapi tidak. Gelung peristiwa JavaScript memproses arahan ini secara berbeza.
Hasilnya sebenarnya begini:
> console log first! > console log last!!! > promise third > set timeout second!
Gelung acara menyusun semula keutamaan pelaksanaan:
Ini membolehkan enjin JavaScript berfungsi secara tidak segerak, melaksanakan tugas lain tanpa menunggu semua operasi selesai serta-merta.
Foto Muka Depan oleh Andrew Petrov di Unsplash
Atas ialah kandungan terperinci Janji JavaScript && Ambil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!