Rumah hujung hadapan web tutorial js Menggunakan Promise untuk merangkum fungsi tak segerak dalam NodeJS_node.js

Menggunakan Promise untuk merangkum fungsi tak segerak dalam NodeJS_node.js

May 16, 2016 pm 04:13 PM
promise

Dalam proses menulis Node.js, operasi IO yang berterusan mungkin membawa kepada "mimpi ngeri piramid". Berbilang fungsi panggil balik menjadikan kod itu sukar untuk dikekalkan untuk merangkum fungsi tak segerak dan menggunakan API bersatu untuk menghilangkan mimpi ngeri berbilang panggilan balik.

Model IO tidak menyekat yang disediakan oleh Node.js membolehkan kami menggunakan fungsi panggil balik untuk mengendalikan operasi IO Walau bagaimanapun, apabila operasi IO berterusan diperlukan, fungsi panggil balik anda akan bersarang beberapa kali, menjadikan kod itu sangat tidak sedap dipandang. untuk mengekalkan. Dan mungkin terdapat banyak kod pendua untuk pengendalian ralat, yang dipanggil "Pyramid of Doom".

Salin kod Kod adalah seperti berikut:

langkah1(fungsi (nilai1) {
Langkah2(nilai1, fungsi(nilai2) {
         langkah3(nilai2, fungsi(nilai3) {
              langkah4(nilai3, fungsi(nilai4) {
// Lakukan sesuatu dengan nilai4
            });
        });
});
});

Ini sebenarnya masalah dengan aliran Kawalan Node.js Terdapat banyak penyelesaian untuk masalah ini, seperti menggunakan async, atau eventProxy, dsb. Walau bagaimanapun, tema artikel ini ialah menggunakan Promise dalam spesifikasi CommonJs untuk menyelesaikan masalah ini. masalah.

Apa itu Janji?

Terdapat banyak spesifikasi Promise CommonJs Kami biasanya membincangkan spesifikasi Promise/A, yang mentakrifkan kelakuan asas Promise.

Janji ialah objek yang biasanya mewakili operasi tak segerak yang mungkin diselesaikan pada masa hadapan. Operasi ini mungkin berjaya atau gagal, jadi objek Promise biasanya mempunyai tiga keadaan: Menunggu, Dipenuhi dan Ditolak. Mewakili penyiapan yang tidak lengkap, berjaya dan kegagalan operasi masing-masing. Sebaik sahaja keadaan objek Promise berubah daripada Menunggu kepada Dipenuhi atau Ditolak, keadaannya tidak boleh diubah.

Objek Promise biasanya mempunyai kaedah kemudian, yang membolehkan kita memanipulasi nilai yang dikembalikan selepas kemungkinan kejayaan pada masa hadapan atau sebab kegagalan. Kaedah kemudian kelihatan seperti ini:

janji.kemudian(padaDitepati, padaDitolak)
Jelas sekali, kaedah kemudian menerima dua parameter, yang biasanya dua fungsi Satu digunakan untuk mengendalikan keputusan selepas operasi berjaya, dan satu lagi digunakan untuk mengendalikan sebab-sebab selepas operasi gagal adalah hasil demi kejayaan dan sebab kegagalan masing-masing. Jika parameter diserahkan kepada kaedah kemudian bukan fungsi, parameter ini akan diabaikan.

Nilai pulangan kaedah kemudian adalah objek Promise Ciri ini membolehkan kita membuat panggilan berantai kemudian untuk mencapai kesan mengawal aliran. Terdapat banyak isu terperinci di sini, seperti pemindahan nilai atau pengendalian ralat. Spesifikasi Promise ditakrifkan seperti berikut:

Nilai pulangan bagi fungsi onFulfilled atau onRejected bukan objek Promise, maka nilai ini akan digunakan sebagai parameter pertama onFulfilled dalam kaedah seterusnya Jika nilai pulangan ialah objek Promise, mengapa nilai pulangan daripada kaedah itu objek Janji
Jika pengecualian dilemparkan dalam fungsi onFulfilled atau onRejected, status objek Promise yang dikembalikan oleh kaedah kemudian akan ditukar kepada Rejected Jika objek Promise memanggil kemudian, objek Ralat akan digunakan sebagai parameter pertama fungsi onRejected
Jika status Promise menjadi Ditepati dan tiada fungsi onFulfilled disediakan dalam kaedah itu, status objek Promise yang dikembalikan oleh kaedah itu menjadi Ditepati dan hasil yang berjaya adalah hasil daripada Promise sebelumnya. Begitu juga dengan Rejected.
Selain itu, onFulfilled dan onRejected dilaksanakan secara tak segerak.

Pelaksanaan standard: q

Di atas ialah spesifikasi Promise, dan apa yang kami perlukan ialah pelaksanaannya q ialah perpustakaan dengan spesifikasi pelaksanaan yang lebih baik untuk Promise/A.

Mula-mula kita perlu membuat objek Promise Spesifikasi untuk penciptaan objek Promise adalah dalam Promise/B Saya tidak akan memberikan penjelasan terperinci di sini, hanya pergi ke kod.

Salin kod Kod adalah seperti berikut:

Fungsi(bendera){
         var defer = q.defer();
             fs.readFile("a.txt", fungsi (err, data){
If(err) defer.reject(err);
                 lain tunda.selesai(data);
            });
                balik tangguh.janji;
}

Kebanyakan pelaksanaan Promise adalah serupa dalam penciptaan Promise Dengan mencipta objek defer dengan atribut promise, jika nilai berjaya diperoleh, defer.resolve(value) dipanggil Jika gagal, defer.reject(reason ) dipanggil Akhirnya, kembalikan atribut janji penangguhan. Proses ini boleh difahami sebagai memanggil defer.resolve untuk menukar status Promise kepada Ditepati, dan memanggil defer.reject untuk menukar status Promise kepada Ditolak.

Apabila berhadapan dengan satu siri kaedah tak segerak yang berterusan, bagaimana menggunakan Promise untuk menulis kod yang cantik? Sila lihat contoh di bawah.

Salin kod Kod adalah seperti berikut:

promise0.then(fungsi(hasil){
              // melakukan sesuatu
        pulangkan hasil;
}).kemudian(fungsi(hasil) {
              // melakukan sesuatu
          balas janji1;                                          }).kemudian(fungsi(hasil) {
              // melakukan sesuatu
}).tangkap(fungsi(cth) {
console.log(ex);
}).akhirnya(fungsi(){
console.log("final");
});

Dalam kod di atas, kaedah kemudian hanya menerima OnFulfilled, dan kaedah tangkapan sebenarnya kemudian (null, OnRejected Dalam kes ini, selagi satu siri kaedah tak segerak sentiasa mengembalikan nilai, kod itu akan). menjadi gaya air terjun, jika mana-mana kaedah tak segerak gagal atau pengecualian berlaku, maka menurut spesifikasi CommonJs Promise, fungsi dalam tangkapan akan dilaksanakan. q juga menyediakan kaedah akhirnya, yang mudah difahami secara literal, iaitu, tanpa mengira penyelesaian atau menolak, fungsi dalam akhirnya akan dilaksanakan.

Nampak bagus, kod lebih boleh diselenggara dan cantik, jadi bagaimana jika anda mahu concurrency?

Salin kod Kod adalah seperti berikut:
​ q.all([promise0, promise1, promise2]).spread(function(val0, val1, val2){
console.log(argumen);
                    }).kemudian(fungsi(){
console.log("selesai");
                  }).tangkap(fungsi(err){
console.log(err);
                });

Q juga menyediakan API untuk concurrency Call the all method dan lulus array Promise untuk terus menggunakan gaya rantaian. Terdapat juga perkara seperti q.nfbind yang boleh menukar API asli Node.js kepada Promise untuk menyatukan format kod, yang juga sangat bagus. Lebih banyak API tidak akan diterangkan secara terperinci di sini.

Kesimpulan

Artikel ini terutamanya memperkenalkan penggunaan Promise untuk menyelesaikan masalah aliran kawalan Node.js, tetapi Promise juga boleh digunakan pada bahagian hadapan EMCAScript6 telah menyediakan sokongan API asli. Perlu diingatkan bahawa Promise bukan satu-satunya penyelesaian async juga merupakan pilihan yang baik dan menyediakan API kawalan konkurensi yang lebih mesra Walau bagaimanapun, saya fikir Promise mempunyai lebih banyak kelebihan apabila merangkum fungsi dengan kaedah tak segerak.

Baiklah, artikel ini berakhir di sini, saya harap ia dapat membantu semua orang.

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Muzium Dua Point: Semua Pameran dan Di Mana Mencari Mereka
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah yang perlu saya lakukan jika saya menghadapi Uncaught (dalam janji) TypeError dalam aplikasi Vue? Apakah yang perlu saya lakukan jika saya menghadapi Uncaught (dalam janji) TypeError dalam aplikasi Vue? Jun 25, 2023 pm 06:39 PM

Vue ialah rangka kerja bahagian hadapan yang popular, dan pelbagai ralat serta masalah sering dihadapi semasa membangunkan aplikasi. Antaranya, Uncaught(inpromise)TypeError ialah jenis ralat biasa. Dalam artikel ini, kita akan membincangkan punca dan penyelesaiannya. Apakah itu Uncaught(inpromise)TypeError? Ralat Uncaught(inpromise)TypeError biasanya muncul dalam

Menepati janji anda: Kebaikan dan keburukan menunaikan janji anda Menepati janji anda: Kebaikan dan keburukan menunaikan janji anda Feb 18, 2024 pm 08:06 PM

Dalam kehidupan seharian, kita sering menghadapi masalah antara janji dan menunaikan. Sama ada dalam hubungan peribadi atau transaksi perniagaan, menunaikan janji adalah kunci untuk membina kepercayaan. Walau bagaimanapun, kebaikan dan keburukan komitmen sering menjadi kontroversi. Artikel ini akan meneroka kebaikan dan keburukan komitmen dan memberi beberapa nasihat tentang cara untuk mengekalkan kata-kata anda. Faedah yang dijanjikan adalah jelas. Pertama, komitmen membina kepercayaan. Apabila seseorang menepati kata-katanya, dia membuat orang lain percaya bahawa dia seorang yang boleh dipercayai. Kepercayaan adalah ikatan yang terjalin antara orang, yang boleh menjadikan orang lebih banyak

Ketahui lebih lanjut tentang Promise.resolve() Ketahui lebih lanjut tentang Promise.resolve() Feb 18, 2024 pm 07:13 PM

Penjelasan terperinci Promise.resolve() memerlukan contoh kod khusus Promise ialah mekanisme dalam JavaScript untuk mengendalikan operasi tak segerak. Dalam pembangunan sebenar, selalunya perlu untuk memproses beberapa tugas tak segerak yang perlu dilaksanakan mengikut turutan, dan kaedah Promise.resolve() digunakan untuk mengembalikan objek Promise yang telah dipenuhi. Promise.resolve() ialah kaedah statik kelas Promise, yang menerima a

Contoh analisis prinsip dan penggunaan Janji ES6 Contoh analisis prinsip dan penggunaan Janji ES6 Aug 09, 2022 pm 03:49 PM

Gunakan objek Promise untuk menukar fungsi biasa untuk mengembalikan Promise untuk menyelesaikan masalah panggilan balik neraka. Fahami logik panggilan kejayaan dan kegagalan Promise dan buat pelarasan secara fleksibel. Fahami pengetahuan teras, gunakannya dahulu, dan perlahan-lahan integrasikan dan serap pengetahuan.

Apakah kelebihan fungsi PHP yang mengembalikan objek Promise? Apakah kelebihan fungsi PHP yang mengembalikan objek Promise? Apr 19, 2024 pm 05:03 PM

Kelebihan: tak segerak dan tidak menyekat, tidak menyekat benang utama meningkatkan kebolehbacaan kod dan mekanisme pengendalian ralat;

Apakah objek janji? Apakah objek janji? Nov 01, 2023 am 10:05 AM

Keadaan objek janji adalah: 1. belum selesai: keadaan awal, bukan keadaan kejayaan atau kegagalan 2. dipenuhi: bermakna operasi berjaya diselesaikan 3. ditolak: bermakna operasi gagal. Setelah objek Promise selesai, ia akan berubah daripada keadaan belum selesai kepada keadaan dipenuhi atau ditolak, dan tidak boleh berubah lagi. Objek janji digunakan secara meluas dalam JavaScript untuk mengendalikan operasi tak segerak seperti permintaan AJAX dan operasi bermasa.

Alat pembangunan bahagian hadapan: Peranan dan kelebihan Promise dalam menyelesaikan masalah tak segerak Alat pembangunan bahagian hadapan: Peranan dan kelebihan Promise dalam menyelesaikan masalah tak segerak Feb 22, 2024 pm 01:15 PM

Alat pembangunan front-end: Peranan dan kelebihan Promise dalam menyelesaikan masalah tak segerak Pengenalan: Dalam pembangunan front-end, kita sering menghadapi masalah pengaturcaraan tak segerak. Apabila kita perlu melakukan berbilang operasi tak segerak atau mengendalikan berbilang panggilan balik tak segerak pada masa yang sama, kod itu sering menjadi kompleks dan sukar untuk dikekalkan. Untuk menyelesaikan masalah sedemikian, Janji wujud. Promise ialah model pengaturcaraan untuk mengendalikan operasi tak segerak. Ia menyediakan keupayaan untuk memproses operasi tak segerak dengan cara segerak, menjadikan kod lebih ringkas dan boleh dibaca. Artikel ini akan memperkenalkan

Satu artikel akan membantu anda menguasai Promise dengan mudah Satu artikel akan membantu anda menguasai Promise dengan mudah Feb 10, 2023 pm 07:49 PM

Dalam pembelajaran js bahagian hadapan, perkara yang paling tidak selesa untuk semua orang ialah masalah asynchronousness Untuk menyelesaikan masalah seperti asynchronous dan callback hell, anda mesti belajar janji Bagi kebanyakan pengaturcara bahagian hadapan, janji hanyalah mimpi ngeri dari Sudut yang mudah difahami digunakan sebagai pintu masuk untuk membantu semua orang menguasai janji dengan mudah.

See all articles