Apakah fungsi panggil balik, dan bagaimanakah ia berbeza daripada fungsi biasa?
Bagaimanakah Promises meningkatkan kebolehbacaan kod dan mengurus operasi tak segerak berbanding dengan panggilan balik?
Apakah keadaan utama Janji, dan bagaimanakah keadaan tersebut beralih antara keadaan ini?
Bagaimanakah anda boleh mengendalikan ralat menggunakan Promises, dan bagaimana ini dibandingkan dengan pengendalian ralat dengan panggilan balik?
Apakah perbezaan antara Promise.all dan Promise.race, dan bilakah anda akan menggunakannya?
Bagaimanakah sintaks async/wait memudahkan kerja dengan Promises dan apakah peraturan untuk menggunakan await?
Dalam landskap JavaScript yang berkembang, mengurus operasi tak segerak dengan cekap adalah kunci untuk membina aplikasi web yang berprestasi. Walaupun panggilan balik adalah pendekatan asal, Promises telah memperkenalkan cara yang lebih berstruktur dan boleh dibaca untuk mengendalikan tugas tak segerak. Blog ini menyelidiki selok-belok menggunakan Janji berbanding panggilan balik, dengan anggapan anda sudah mempunyai pemahaman asas tentang konsep ini.
Panggil balik, walaupun berfungsi, selalunya membawa kepada struktur bersarang dalam yang dikenali sebagai "neraka panggil balik", menjadikan kod sukar dibaca dan diselenggara.
fetchData(function(response1) { fetchMoreData(response1, function(response2) { fetchEvenMoreData(response2, function(response3) { console.log(response3); }); }); });
fetchData() .then(response1 => fetchMoreData(response1)) .then(response2 => fetchEvenMoreData(response2)) .then(response3 => console.log(response3)) .catch(error => console.error(error));
Dengan panggilan balik, pengendalian ralat boleh menjadi menyusahkan kerana anda perlu menghantar objek ralat dan mengendalikannya pada setiap peringkat.
function fetchData(callback) { setTimeout(() => { if (/* error condition */) { callback(new Error('An error occurred'), null); } else { callback(null, 'data'); } }, 1000); } fetchData((error, data) => { if (error) { console.error(error); } else { console.log(data); } });
function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { if (/* error condition */) { reject(new Error('An error occurred')); } else { resolve('data'); } }, 1000); }); } fetchData() .then(data => console.log(data)) .catch(error => console.error(error));
Promise.all berguna apabila anda perlu menunggu beberapa operasi tak segerak selesai sebelum meneruskan.
const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then(values => { console.log(values); // [3, 42, "foo"] });
Promise.race bermanfaat apabila anda memerlukan hasil operasi terpantas.
const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one'); }); const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'two'); }); Promise.race([promise1, promise2]).then(value => { console.log(value); // "two" });
Sintaks tak segerak/menunggu membolehkan anda menulis kod tak segerak yang kelihatan segerak, meningkatkan kebolehbacaan dan mengurangkan kerumitan merantai Janji.
async function fetchData() { return 'data'; } async function processData() { try { const data = await fetchData(); console.log(data); } catch (error) { console.error(error); } } processData();
Sementara panggilan balik meletakkan asas untuk mengendalikan operasi tak segerak dalam JavaScript, Promises telah meningkatkan kebolehbacaan, kebolehselenggaraan dan keupayaan pengendalian ralat kod tak segerak dengan ketara. Memahami cara dan bila untuk menggunakan alat ini dengan berkesan adalah penting untuk pembangunan JavaScript moden. Dengan Janji dan sintaks async/menunggu, pembangun boleh menulis kod yang lebih bersih, lebih terurus, membuka jalan untuk aplikasi yang lebih mantap.
Atas ialah kandungan terperinci JS: Janji atau Panggilan Balik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!