เครื่องกำเนิดไฟฟ้าเป็นรูปแบบ coroutine (coroutine) ของ JavaScript มันหมายถึงฟังก์ชั่นที่สามารถหยุดชั่วคราวแล้วกลับมาทำงานต่อในระหว่างการดำเนินการ ฟังก์ชั่นนี้มาพร้อมกับสัญลักษณ์เครื่องหมายดอกจันในฟังก์ชั่นเช่นฟังก์ชัน*และคำหลักบางอย่างในฟังก์ชันเช่นผลผลิตและผลผลิต*
ฟังก์ชั่น* generatorfn () {console.log ('look ma i ถูกระงับ')} var generator = generatorfn () // [1] settimeout (function () {generator.next () // [2]}, 2000)[1] และ [2] ที่ทำเครื่องหมายไว้ในรหัสมีการอธิบายดังนี้:
1. นี่คือเครื่องกำเนิดไฟฟ้าที่เริ่มต้นด้วยการหยุดชั่วคราว ไม่มีเอาต์พุตคอนโซลในเวลานี้
2. โดยการเรียกใช้วิธีการถัดไป () สามารถดำเนินการเครื่องกำเนิดไฟฟ้าและทำงานได้จนกว่าจะพบคำหลักอัตราผลตอบแทนถัดไปหรือส่งคืน ตอนนี้เรามีเอาต์พุตคอนโซล
มาดูอีกกรณี:
ฟังก์ชั่น *generator () {console.log ('Start!'); var i = 0; ในขณะที่ (จริง) {ถ้า (i <3) ให้ I ++; }} var gen = generator ();รหัสข้างต้นคล้ายกับรหัสแรก แต่มีคำหลักให้ผลผลิตเพิ่มเติมในฟังก์ชั่นเครื่องกำเนิดไฟฟ้า เมื่อมีการเรียกรหัสข้างต้นมันจะไม่ถูกเรียกใช้งานทันที แต่จะหยุดสถานะสแตนด์บายชั่วคราวดังนั้นจะไม่มีการเริ่มต้น มันไม่ได้ดำเนินการจนกว่าจะโทร () ครั้งต่อไป
var ret = gen.next (); // start! console.log (ret); // {value: 0, เสร็จแล้ว: false}RET ข้างต้นคือผลลัพธ์ของเครื่องกำเนิดไฟฟ้า มันมีสองคุณสมบัติ:
■ค่า, ค่าอัตราผลตอบแทนในฟังก์ชันเครื่องกำเนิด
■เสร็จแล้วนี่คือธงที่ระบุว่าฟังก์ชั่นเครื่องกำเนิดไฟฟ้ากลับมาหรือไม่
ดำเนินการต่อรหัสดังต่อไปนี้:
console.log (gen.next ()); // {value: 1, ทำ: false} console.log (gen.next ()); // {value: 2, ทำ: false} console.log (gen.next ()); // {ค่า: ไม่ได้กำหนด: จริง}}เครื่องกำเนิดไฟฟ้าไม่มีความลึกลับในการเขียนโปรแกรมแบบซิงโครนัสและเหมาะอย่างยิ่งสำหรับการเขียนโปรแกรมแบบอะซิงโครนัส
เครื่องกำเนิดไฟฟ้ามีสองลักษณะ:
1. คุณสามารถเลือกที่จะกระโดดออกจากฟังก์ชั่นให้รหัสภายนอกตัดสินใจว่าจะข้ามไปยังฟังก์ชั่นนี้เมื่อใดและดำเนินการต่อ
2. สามารถควบคุมแบบอะซิงโครนัสได้
ดูรหัสดำเนินการแบบอะซิงโครนัสต่อไปนี้:
var gen = generator (); console.log (gen.next (). value); settimeout (function () {console.log (gen.next (). value); console.log ('ขั้นตอนแรก');}, 1000); console.log ('ขั้นตอนที่สอง');ผลลัพธ์คือ:
0
ขั้นตอนที่ 2
1
ขั้นตอนแรก
กล่าวอีกนัยหนึ่งคุณจะไม่รอให้หมดเวลาจะสิ้นสุดลงที่ SettimeOut แต่จะดำเนินการต่อโดยตรงกับ "ขั้นตอนที่สอง" และจะไม่ถูกบล็อกเมื่อ SettimeOut
มาดูรหัสอีกชิ้นหนึ่ง:
ฟังก์ชั่น* channel () {var name = dielt 'สวัสดีคุณชื่ออะไร?' // [1] return 'well hi มี' + name} var gen = channel () console.log (gen.next (). ค่า) // สวัสดีคุณชื่ออะไร? [2] console.log (gen.next ('billy')) // สวัสดีมีบิลลี่ [3]นอกจากนี้คุณยังสามารถใช้ * ในระหว่างการเดินทาง:
ฟังก์ชั่น* iter () {สำหรับ (var i = 0; i <10; i ++) ผลผลิต i} สำหรับ (var val ของ iter ()) {console.log (val) // outputs 1? - 9}ความเข้าใจผิดทั่วไป
เนื่องจากฉันสามารถหยุดการทำงานของฟังก์ชั่นชั่วคราวฉันควรปล่อยให้พวกเขาดำเนินการแบบขนานหรือไม่? ไม่เนื่องจาก JavaScript เป็นเธรดเดียวและหากคุณต้องการค้นหาการปรับปรุงประสิทธิภาพเครื่องกำเนิดไฟฟ้าไม่ใช่จานของคุณ
ตัวอย่างเช่นรหัสต่อไปนี้จะดำเนินการหมายเลข Fibonacci แยกกัน:
ฟังก์ชั่น fib (n) {var current = 0, next = 1, swap สำหรับ (var i = 0; i <n; i ++) {swap = current, current = next = swap+next} return current} function* fibgen (n) {var current = 0, ถัดไป = 1, swap for (var i = 0;ผลการปฏิบัติงานมีดังนี้: (ยิ่งสูงกว่า)
ผลลัพธ์:
ปกติ 1263899
เครื่องกำเนิด 37541
เครื่องกำเนิดไฟฟ้าเปล่งประกาย
เครื่องกำเนิดไฟฟ้าสามารถทำให้ความซับซ้อนของฟังก์ชั่นง่ายขึ้นใน JavaScript
การมอบหมายขี้เกียจ
แม้ว่าการมอบหมายที่ขี้เกียจสามารถนำไปใช้ได้โดยใช้การปิด JS แต่การใช้ผลผลิตจะทำให้ง่ายขึ้นอย่างมาก ผ่านการหยุดชั่วคราวและการกู้คืนเราสามารถรับค่าตัวเลขเมื่อเราต้องการ ตัวอย่างเช่นฟังก์ชั่น fibgen ด้านบนสามารถดึงค่าใหม่เมื่อเราต้องการ:
var fibiter = fibgen (20) var next = fibiter.next () console.log (next.value) settimeout (ฟังก์ชั่น () {var next = fibiter.next () console.log (next.value)}, 2000) แน่นอนลำดับที่ไม่มีที่สิ้นสุด
เนื่องจากคุณสามารถขี้เกียจที่จะกำหนดค่าคุณอาจทำกลอุบาย Haskell บางอย่างคล้ายกับลำดับที่ไม่มีที่สิ้นสุด ที่นี่คุณสามารถให้จำนวนลำดับที่ไม่มีที่สิ้นสุด
ฟังก์ชั่น* fibgen () {var current = 0, next = 1, swap ในขณะที่ (จริง) {swap = current, current = next next = swap + next dielt current}}}มาดูการมอบหมายที่ขี้เกียจของกระแสฟีโบนักชีและขอให้ส่งคืนหมายเลขฟีโบนักชีแรกหลังจาก 5,000:
สำหรับ (var num ของ fibgen ()) {ถ้า (num> 5000) break} console.log (num) // 6765การควบคุมกระบวนการแบบอะซิงโครนัส
การใช้เครื่องกำเนิดไฟฟ้าเพื่อใช้งานการควบคุมกระบวนการแบบอะซิงโครนัสส่วนใหญ่แพคเกจห้องสมุดสัญญาต่าง ๆ ส่วนใหญ่ทำงานอย่างไร
ในโลกโหนดทุกอย่างเกี่ยวข้องกับการโทรกลับซึ่งเป็นฟังก์ชั่นอะซิงโครนัสระดับต่ำของเรา เราสามารถใช้เครื่องกำเนิดไฟฟ้าเพื่อสร้างช่องทางการสื่อสารเพื่อเขียนรหัสแบบอะซิงโครนัสในรูปแบบของการเขียนโปรแกรมแบบซิงโครนัส
run (function* () {console.log ("เริ่มต้น") var file = readfile ("./ async.js") // [1] console.log (file.toString ())})หมายเหตุ 1 หมายความว่าโปรแกรมจะดำเนินต่อไปก่อนที่จะรอ async.js เพื่อส่งคืนผลลัพธ์
Genify เป็นกรอบที่นำเครื่องกำเนิดไฟฟ้าเข้าสู่สภาพแวดล้อมการเขียนโปรแกรมปกติโดยใช้สิ่งต่อไปนี้:
NPM ติดตั้ง Genify สำหรับการติดตั้งรหัสมีดังนี้:
var q = ต้องการ ('q'); var fs = ต้องการ ('fs'); var genify = ต้องการ ('genify'); // ห่อวัตถุของคุณลงใน genify functionvar object = genify ({concatfiles: function * (file1, file2, outfile) {file1 = ให้ผล q.nfcall (fs.readfile, file1); file2 = ให้ผล q.nfcall (fs.readfile, file2); - // concatfiles เป็นฟังก์ชั่นเครื่องกำเนิดไฟฟ้าที่ใช้ความสามารถอันทรงพลังของเครื่องกำเนิดไฟฟ้า Object.concatfiles ('./ somefile1.txt', './somefile2.txt', './concated.txt').Then(Function (res) {// ทำอะไรกับผลลัพธ์}, ฟังก์ชั่น (err) {// ทำอะไรที่มีข้อผิดพลาด});คำอธิบายโดยละเอียดข้างต้นเกี่ยวกับการใช้เครื่องกำเนิดไฟฟ้า JavaScript ใน node.js เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น