ใน Javascript มีซิงโครและไม่ตรงกันฟังก์ชั่น
ฟังก์ชั่นซิงโครนัส
ฟังก์ชั่นส่วนใหญ่ใน Javascript เป็นแบบซิงโครนัส ถ้าคุณจะเรียกฟังก์ชั่นซิงโครนัสหลาย ๆ อันในแถว
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
พวกเขาจะดำเนินการตามลำดับ doSomethingElse
จะไม่เริ่มจนกว่าจะdoSomething
เสร็จสมบูรณ์ doSomethingUsefulThisTime
ในที่สุดก็จะไม่เริ่มจนกว่าจะdoSomethingElse
เสร็จสมบูรณ์
ฟังก์ชันแบบอะซิงโครนัส
อย่างไรก็ตามฟังก์ชันอะซิงโครนัสจะไม่รอซึ่งกันและกัน ให้เราดูตัวอย่างรหัสเดียวกันกับที่เรามีข้างบนคราวนี้สมมติว่าฟังก์ชั่นเป็นแบบอะซิงโครนัส
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
ฟังก์ชั่นจะเริ่มต้นตามลำดับ แต่พวกเขาทั้งหมดจะดำเนินการประมาณในเวลาเดียวกัน คุณไม่สามารถคาดเดาได้อย่างต่อเนื่องว่าแบบใดจะเสร็จสิ้นก่อน: อันที่เกิดขึ้นเพื่อใช้เวลาในการดำเนินการที่สั้นที่สุดจะเสร็จสิ้นก่อน
แต่บางครั้งคุณต้องการฟังก์ชั่นที่ไม่ทำงานเพื่อดำเนินการตามลำดับและบางครั้งคุณต้องการฟังก์ชั่นที่ทำงานแบบซิงโครนัส โชคดีที่สามารถโทรกลับและหมดเวลาได้ตามลำดับ
เรียกกลับ
สมมติว่าเรามีสามฟังก์ชั่นไม่ตรงกันว่าเราต้องการที่จะดำเนินการในการสั่งซื้อsome_3secs_function
, และsome_5secs_function
some_8secs_function
เนื่องจากสามารถส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์ใน Javascript ได้คุณจึงสามารถส่งผ่านฟังก์ชันเป็นการโทรกลับเพื่อเรียกใช้งานหลังจากที่ฟังก์ชันเสร็จ
ถ้าเราสร้างฟังก์ชั่นเช่นนี้
function some_3secs_function(value, callback){
//do stuff
callback();
}
จากนั้นคุณสามารถโทรตามลำดับเช่นนี้:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
หมดเวลา
ใน Javascript คุณสามารถบอกให้ฟังก์ชั่นดำเนินการหลังจากหมดเวลา (ในหน่วยมิลลิวินาที) สิ่งนี้สามารถทำให้ฟังก์ชั่นซิงโครนัสทำงานแบบอะซิงโครนัสได้
หากเรามีฟังก์ชั่นซิงโครนัสสามตัวเราสามารถเรียกใช้setTimeout
ฟังก์ชันแบบอะซิงโครนัสได้โดยใช้ฟังก์ชัน
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
นี้เป็นอย่างไรบิตน่าเกลียดและละเมิดหลักการแห้ง [วิกิพีเดีย] เราสามารถล้างข้อมูลได้โดยการสร้างฟังก์ชั่นที่ยอมรับฟังก์ชั่นและการหมดเวลา
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
สามารถเรียกได้ว่าเป็นเช่นนี้:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
โดยสรุปหากคุณมีฟังก์ชั่นแบบอะซิงโครนัสที่คุณต้องการเรียกใช้แบบซิงโครนัสให้ใช้การโทรกลับและหากคุณมีฟังก์ชั่นซิงโครนัสที่คุณต้องการเรียกใช้แบบอะซิงโครนัส