ผ่านฟังก์ชั่นเป็นพารามิเตอร์ลงในฟังก์ชั่นอื่น ฟังก์ชั่นนี้เรียกว่าฟังก์ชันการโทรกลับ
มันมักจะพบในสถานการณ์นี้ว่าชั้น A และ B ของโครงการเสร็จสมบูรณ์โดยบุคลากรที่แตกต่างกันโดยความร่วมมือ เลเยอร์ A มีหน้าที่รับผิดชอบฟังก์ชั่น Funa และ B BUN COUNLY สำหรับ FUNCB เมื่อ B B Layer ต้องการใช้ข้อมูลของโมดูลที่แน่นอนเขาบอกเจ้าหน้าที่ A Layer ว่าฉันต้องการให้คุณให้ข้อมูลที่ตรงกับความต้องการบางอย่างและคุณให้อินเทอร์เฟซแก่ฉัน
พนักงานที่ระดับ A กล่าวว่า: ฉันจะให้ข้อมูลแก่คุณและวิธีการแสดงและประมวลผลเป็นธุรกิจของ B
แน่นอนเลเยอร์ B ไม่สามารถจัดเตรียมอินเทอร์เฟซข้อมูลสำหรับทุกข้อกำหนด B จัดเตรียมอินเทอร์เฟซให้ผ่าน B รับข้อมูลจากนั้น B เขียนฟังก์ชั่นเพื่อแสดง
นั่นคือคุณต้องทำงานร่วมกับผู้อื่นและผู้อื่นให้ข้อมูลและคุณไม่จำเป็นต้องมุ่งเน้นไปที่วิธีที่ผู้อื่นได้รับหรือสร้างข้อมูล คุณเพียงแค่ต้องใช้งานข้อมูลที่คุณได้รับ คุณต้องใช้ฟังก์ชั่นการโทรกลับในเวลานี้
ดังนั้นการโทรกลับเป็นรูปแบบการออกแบบเป็นหลักและหลักการออกแบบของ jQuery (รวมถึงกรอบอื่น ๆ ) ทำตามรูปแบบนี้
ตัวอย่างของการใช้การเรียกกลับในการซิงโครไนซ์ (การบล็อก) คือการเรียกใช้ FunC2 หลังจากเรียกใช้รหัส FUNC1
การคัดลอกรหัสมีดังนี้:
var func1 = ฟังก์ชั่น (โทรกลับ) {
// ทำอะไรบางอย่าง
(การโทรกลับ && typeof (การโทรกลับ) === "ฟังก์ชั่น") && callback ();
-
func1 (func2);
var func2 = function () {
-
ตัวอย่างของการโทรกลับแบบอะซิงโครนัส:
การคัดลอกรหัสมีดังนี้:
$ (เอกสาร). พร้อม (โทรกลับ);
$ .ajax ({
URL: "test.html"
บริบท: document.body
}). เสร็จ (ฟังก์ชัน () {
$ (นี่) .addclass ("เสร็จสิ้น");
}). ล้มเหลว (ฟังก์ชั่น () {
การแจ้งเตือน ("ข้อผิดพลาด");
}). เสมอ (ฟังก์ชัน () {
การแจ้งเตือน ("เสร็จสมบูรณ์");
-
โปรดทราบว่าคำขอ AJAX นั้นเป็นแบบอะซิงโครนัส แต่เบราว์เซอร์ขอคำขอนี้ เมื่อสถานะของคำขอมีการเปลี่ยนแปลงหากมีการตั้งค่าการโทรกลับมาก่อนเธรดอะซิงโครนัสจะสร้างเหตุการณ์การเปลี่ยนแปลงสถานะและวางไว้ในคิวการประมวลผลของเอ็นจิ้น JavaScript เพื่อรอการประมวลผล ดู: http://www.phpv.net/html/1700.html
เมื่อใดจะมีการเรียกใช้การโทรกลับ
ฟังก์ชั่นการโทรกลับมักจะถูกดำเนินการครั้งสุดท้ายในสถานการณ์แบบซิงโครนัส แต่อาจไม่ถูกดำเนินการในสถานการณ์แบบอะซิงโครนัสเนื่องจากเหตุการณ์ไม่ได้ถูกทริกเกอร์หรือไม่เป็นไปตามเงื่อนไข
ใช้กรณีของฟังก์ชั่นการโทรกลับ
การโหลดทรัพยากร: เรียกใช้การโทรกลับหลังจากการโหลดแบบไดนามิกของไฟล์ JS, เรียกใช้การโทรกลับหลังจากโหลด iframe, เรียกใช้การโทรกลับหลังจากโหลดการดำเนินการโทรกลับ AJAX, เรียกใช้การเรียกกลับหลังจากการโหลดอิมเมจ, AJAX ฯลฯ
เหตุการณ์ DOM และเหตุการณ์ Node.js ขึ้นอยู่กับกลไกการโทรกลับ (node.js callbacks อาจมีปัญหาการทำรังกลับหลายชั้น)
เวลาหน่วงของการตั้งถิ่นฐานคือ 0 แฮ็คนี้มักจะใช้ ฟังก์ชั่นที่เรียกโดย settimeout เป็นศูนย์รวมการโทรกลับ
สายโซ่: เมื่อสายโซ่เป็นเรื่องง่ายที่จะใช้การโทรแบบโซ่ในเมธอดผู้ประเมิน (setter) (หรือในวิธีการที่ไม่คืนค่า) แต่ค่า getter นั้นค่อนข้างยากที่จะใช้สายโซ่เนื่องจากคุณต้องการค่า getter เพื่อส่งคืนข้อมูลที่คุณต้องการแทนตัวชี้นี้ หากคุณต้องการใช้เมธอดโซ่คุณสามารถใช้ฟังก์ชั่นการโทรกลับเพื่อใช้งานได้
การเรียกใช้ฟังก์ชันของ settimeout และ setInterval จะได้รับค่าส่งคืน เนื่องจากฟังก์ชั่นทั้งสองเป็นแบบอะซิงโครนัสนั่นคือเวลาการโทรและกระบวนการหลักของโปรแกรมค่อนข้างเป็นอิสระจึงไม่มีวิธีที่จะรอมูลค่าการคืนค่าของพวกเขาในร่างกายและโปรแกรมจะไม่หยุดและรอเมื่อเปิดออก ดังนั้นจึงไม่มีความหมายที่จะใช้การส่งคืนดังนั้นจึงสามารถใช้การโทรกลับได้เท่านั้น ความหมายของการโทรกลับคือการแจ้งฟังก์ชั่นพร็อกซีของผลการดำเนินการจับเวลาสำหรับการประมวลผลที่เหมาะสม
ฉันควรมีข้อมูลบางอย่างที่รวบรวมทางออนไลน์และฉันควรเข้าใจ ฉันจะจัดเรียงตัวอย่างด้วยตัวเอง:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นสนุก (num, callback) {
ถ้า (num <0) {
การแจ้งเตือน ("เรียกฟังก์ชัน A-Level เพื่อจัดการ!");
การแจ้งเตือน ("ข้อมูลไม่สามารถลบได้ข้อผิดพลาดอินพุต!");
} อื่นถ้า (num == 0) {
การแจ้งเตือน ("เรียกฟังก์ชัน A-Level เพื่อจัดการ!");
การแจ้งเตือน ("รายการข้อมูลนี้ไม่มีอยู่!");
}อื่น{
การแจ้งเตือน ("เรียกฟังก์ชันระดับ B เพื่อประมวลผล!");
การโทรกลับ (1);
-
-
ฟังก์ชั่นทดสอบ () {
var num = document.getElementById ("คะแนน") ค่า;
สนุก (num, function (back) {// ฟังก์ชั่นการประมวลผล B-layer ที่ไม่ระบุชื่อ
การแจ้งเตือน (":"+กลับ);
ถ้า (num <2)
การแจ้งเตือน ("หมายเลขคือ 1");
อื่นถ้า (num <= 3)
การแจ้งเตือน ("หมายเลขคือ 2 หรือ 3!");
อื่น
การแจ้งเตือน ("จำนวนมากกว่า 3!");
-
-
เมื่อฟังก์ชั่นเริ่มดำเนินการสนุกก่อนอื่นให้ตรวจสอบว่า NUM เป็นจำนวนลบหรือศูนย์มิฉะนั้นเรียกใช้การแจ้งเตือนฟังก์ชันการประมวลผล B-layer (":"+back); เอาท์พุท 1 และกำหนดเป็น <2, <= 3,> 3, ฯลฯ
เคล็ดลับประสบการณ์:
เป็นการดีที่สุดที่จะตรวจสอบให้แน่ใจว่าการโทรกลับมีอยู่และจะต้องเป็นข้อมูลอ้างอิงฟังก์ชั่นหรือการแสดงออกของฟังก์ชั่น:
การคัดลอกรหัสมีดังนี้:
(การโทรกลับ && typeof (การโทรกลับ) === "ฟังก์ชั่น") && callback ();
การคัดลอกรหัสมีดังนี้:
var obj = {
init: function (callback) {
// สิ่งที่ต้องทำ ...
if (callback && typeof (callback) === "function") && callback ()) {
การโทรกลับ ('init ... '); // การโทรกลับ
-
-
สุดท้ายเกี่ยวกับสาเหตุที่คุณต้องใช้ฟังก์ชั่นการโทรกลับ? คำอุปมาต่อไปนี้มีความชัดเจนและน่าสนใจมาก
หากคุณมีสิ่งที่ต้องทำไปที่หอพักถัดไปเพื่อค้นหาเพื่อนร่วมชั้นและพบว่าบุคคลนั้นไม่ได้อยู่ที่นั่นคุณควรทำอย่างไร?
วิธีที่ 1: ไปที่หอพักถัดไปทุกสองสามนาทีเพื่อดูว่าบุคคลนั้นอยู่ที่นั่น
วิธีที่ 2: โปรดโทรหาใครบางคนในหอพักเดียวกันกับเขาและโทรหาคุณเมื่อคุณเห็นเขากลับมา
อดีตคือการสำรวจและหลังคือการโทรกลับ
จากนั้นคุณบอกว่าฉันสามารถรอโดยตรงในหอพักถัดไปได้จนกว่าเพื่อนร่วมชั้นของฉันจะกลับมาหรือไม่?
ใช่ แต่ด้วยวิธีนี้คุณสามารถประหยัดเวลาในการทำสิ่งอื่น ๆ แต่ตอนนี้คุณต้องเสียเวลารอ เปลี่ยนการโทรแบบอะซิงโครนัสที่ไม่ปิดกั้นดั้งเดิมให้กลายเป็นสายแบบซิงโครนัสที่ปิดกั้น
การเรียกกลับของ JavaScript ถูกใช้ในสถานการณ์การโทรแบบอะซิงโครนัสและประสิทธิภาพของการใช้การเรียกกลับดีกว่าการสำรวจ