โมดูล nodejs async: https://github.com/caolan/asyncมี 2 วิธีที่คล้ายกันasync.waterfall
และasync.series
.
อะไรคือความแตกต่างระหว่างพวกเขา?
โมดูล nodejs async: https://github.com/caolan/asyncมี 2 วิธีที่คล้ายกันasync.waterfall
และasync.series
.
อะไรคือความแตกต่างระหว่างพวกเขา?
คำตอบ:
ดูเหมือนว่าasync.waterfall
จะอนุญาตให้แต่ละฟังก์ชันส่งผลลัพธ์ไปยังฟังก์ชันถัดไปในขณะที่async.series
ส่งผลลัพธ์ทั้งหมดไปยังการเรียกกลับครั้งสุดท้าย ในระดับที่สูงกว่าasync.waterfall
จะเป็นไปป์ไลน์ข้อมูล ("ให้ 2, คูณด้วย 3, บวก 2, และหารด้วย 17") ในขณะที่async.series
สำหรับงานที่ไม่ต่อเนื่องที่ต้องดำเนินการตามลำดับ แต่จะแยกกัน
waterfall
มิได้series
ส่งกลับค่า คาดว่าผลลัพธ์จะถูกใช้ในพารามิเตอร์การเรียกกลับที่เป็นทางเลือก
ฟังก์ชันทั้งสองส่งค่าส่งคืนของทุกฟังก์ชันไปยังฟังก์ชันถัดไปจากนั้นเมื่อเสร็จสิ้นจะเรียกการเรียกกลับหลักส่งผ่านข้อผิดพลาดหากเกิดข้อผิดพลาด
ความแตกต่างคือasync.series()
เมื่อซีรีส์จบลงแล้วจะส่งผ่านผลลัพธ์ทั้งหมดไปยังการเรียกกลับหลัก async.waterfall()
จะส่งผ่านไปยังการเรียกกลับหลักเฉพาะผลลัพธ์ของฟังก์ชันสุดท้ายที่เรียก
async.waterfall()
กำลังจัดการกับaction that relies on the previous outcome
ไฟล์.
async.series()
กำลังจัดการกับการกระทำที่ต้องการ see all the result at the end
ฉันคิดว่า async.waterfall เป็นอันตรายเพราะยากที่จะ refactor เมื่อเขียนแล้วและยังเกิดข้อผิดพลาดได้ง่ายเนื่องจากหากคุณจัดหาอาร์กิวเมนต์มากขึ้นฟังก์ชันอื่น ๆ จะเปลี่ยนลายเซ็นไปมาก
ฉันขอแนะนำasync.autoInject
เป็นทางเลือกที่ดีสำหรับ async.waterfall
https://caolan.github.io/async/autoInject.js.html
หากคุณเลือกใช้ async.waterfall ฉันขอแนะนำให้เก็บทุกอย่างไว้ในวัตถุเดียวดังนั้นฟังก์ชันของคุณจึงไม่จำเป็นต้องเปลี่ยนความยาว / ลายเซ็นเช่น:
คำเตือน: นี่เป็นรูปแบบที่ไม่ดี
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
อย่าทำด้วยวิธีข้างต้น นี่เป็นรูปแบบที่ดีกว่ามากที่จะใช้:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
ด้วยวิธีนี้คุณจะไม่ดึงผมออกพยายามทำให้แน่ใจว่าอาร์กิวเมนต์ของฟังก์ชันมีความยาวที่เหมาะสม ฟังก์ชันแรกยอมรับเพียงหนึ่งอาร์กิวเมนต์ - การเรียกกลับ สิ่งที่เหลือทั้งหมดควรยอมรับสองอาร์กิวเมนต์ - ค่าและการเรียกกลับ ยึดติดกับรูปแบบและคุณจะยังคงมีสติ!