Rumah > Artikel > hujung hadapan web > 4 cara untuk melaksanakan corak pengaturcaraan tak segerak dalam kemahiran JavaScript_javascript
Anda mungkin tahu bahawa persekitaran pelaksanaan bahasa Javascript ialah "utas tunggal".
Apa yang dipanggil "benang tunggal" bermakna hanya satu tugasan boleh diselesaikan pada satu masa. Jika terdapat berbilang tugasan, tugasan tersebut mesti beratur Selepas tugasan sebelumnya selesai, tugasan seterusnya akan dilaksanakan, dan seterusnya.
Kelebihan mod ini ialah ia agak mudah untuk dilaksanakan dan persekitaran pelaksanaannya agak mudah ialah selagi satu tugasan mengambil masa yang lama, tugasan berikutnya mesti beratur, yang akan melambatkan pelaksanaan; daripada keseluruhan program. Ketidaktindak balas penyemak imbas biasa (kematian yang digantung) selalunya disebabkan oleh sekeping kod Javascript tertentu yang berjalan untuk masa yang lama (seperti gelung tak terhingga), menyebabkan keseluruhan halaman tersekat di tempat ini dan tugas lain tidak dapat dilakukan.
Untuk menyelesaikan masalah ini, bahasa Javascript membahagikan mod pelaksanaan tugas kepada dua jenis: segerak (Segerak) dan tak segerak (Asynchronous).
"Mod segerak" ialah mod dalam perenggan sebelumnya. Tugasan terakhir menunggu tugasan sebelumnya tamat sebelum melaksanakannya berbeza sama sekali. Setiap tugas mempunyai satu atau lebih fungsi panggil balik (panggilan balik) Selepas tugasan sebelumnya tamat, tugasan seterusnya tidak dilaksanakan, tetapi fungsi panggil balik dilaksanakan tanpa menunggu tugasan sebelumnya tamat pelaksanaan program Susunan tidak konsisten dan tidak segerak dengan susunan tugas.
"Mod tak segerak" adalah sangat penting. Di sisi penyemak imbas, operasi yang berjalan lama harus dilakukan secara tidak segerak untuk mengelakkan penyemak imbas menjadi tidak bertindak balas Contoh terbaik ialah operasi Ajax. Di sisi pelayan, "mod tak segerak" adalah satu-satunya mod, kerana persekitaran pelaksanaan adalah satu-benang Jika semua permintaan http dibenarkan untuk dilaksanakan secara serentak, prestasi pelayan akan menurun secara mendadak dan ia akan kehilangan respons.
Artikel ini meringkaskan 4 kaedah pengaturcaraan "mod tak segerak" Memahaminya akan membolehkan anda menulis program Javascript dengan struktur yang lebih munasabah, prestasi yang lebih baik dan penyelenggaraan yang lebih mudah.
1. Fungsi panggil balik
Ini adalah kaedah paling asas untuk pengaturcaraan tak segerak.
Andaikan terdapat dua fungsi f1 dan f2, dan fungsi kedua menunggu hasil pelaksanaan yang pertama.
Jika f1 adalah tugas yang memakan masa, anda boleh mempertimbangkan untuk menulis semula f1 dan menulis f2 sebagai fungsi panggil balik f1.
tetapkanMasa tamat(fungsi () {
// Kod tugas f1
panggil balik();
}, 1000);
}
Menggunakan kaedah ini, kami menukar operasi segerak kepada operasi tak segerak F1 tidak akan menyekat perjalanan program ini bersamaan dengan melaksanakan logik utama program terlebih dahulu dan menangguhkan pelaksanaan operasi yang memakan masa.
Kelebihan fungsi panggil balik ialah ia mudah, mudah difahami dan digunakan Kelemahannya ialah ia tidak kondusif untuk membaca dan mengekalkan kod Pelbagai bahagian sangat digabungkan (Gandingan), prosesnya sangat mengelirukan, dan setiap tugas hanya boleh menentukan satu fungsi panggil balik.
2. Pemantauan acara
Cara pemikiran lain ialah menggunakan model dipacu peristiwa. Pelaksanaan tugas tidak bergantung pada susunan kod, tetapi pada sama ada peristiwa berlaku.
Mari kita ambil f1 dan f2 sebagai contoh. Pertama, ikat acara ke f1 (jQuery digunakan di sini).
tetapkanMasa tamat(fungsi () {
// Kod tugas f1
f1.trigger('selesai');
}, 1000);
}
Der Vorteil dieser Methode besteht darin, dass sie relativ einfach zu verstehen ist, mehrere Ereignisse binden kann, jedes Ereignis mehrere Rückruffunktionen angeben kann und „entkoppelt“ werden kann, was der Modularisierung förderlich ist. Der Nachteil besteht darin, dass das gesamte Programm ereignisgesteuert werden muss und der laufende Prozess sehr unklar wird.
3. Veröffentlichen/Abonnieren
Das „Ereignis“ im vorherigen Abschnitt kann als „Signal“ verstanden werden.
Wir gehen davon aus, dass es ein „Signalzentrum“ gibt. Wenn eine bestimmte Aufgabe ausgeführt wird, „veröffentlicht“ sie ein Signal an das Signalzentrum, um zu erfahren, was Sie tun können Fangen Sie an, es selbst auszuführen. Dies wird als „Publish-Subscribe-Muster“ (Publish-Subscribe-Muster) oder auch als „Observer-Muster“ (Observer-Muster) bezeichnet.
Es gibt viele Implementierungen dieses Musters. Die unten verwendete ist Ben Almans Tiny Pub/Sub, ein Plug-in für jQuery.
Zuerst abonniert f2 das „Fertig“-Signal von der „Signal Center“-jQuery.
setTimeout(function () {
// Aufgabencode von f1
jQuery.publish("done");
}, 1000);
}
Darüber hinaus können Sie sich auch abmelden, nachdem f2 die Ausführung abgeschlossen hat.
4. Versprechensobjekt
Das Promises-Objekt ist eine von der CommonJS-Arbeitsgruppe vorgeschlagene Spezifikation, um eine einheitliche Schnittstelle für die asynchrone Programmierung bereitzustellen.
Einfach ausgedrückt besteht die Idee darin, dass jede asynchrone Aufgabe ein Promise-Objekt zurückgibt, das über eine then-Methode verfügt, die die Angabe einer Rückruffunktion ermöglicht. Beispielsweise kann die Rückruffunktion f2 von f1 wie folgt geschrieben werden:
var dfd = $.Deferred();
setTimeout(function () {
// Aufgabencode von f1
dfd.resolve();
}, 500);
Rückgabe von dfd.promise;
}
Geben Sie beispielsweise mehrere Rückruffunktionen an: