ความแตกต่างระหว่าง async.waterfall และ async.series คืออะไร


คำตอบ:


168

ดูเหมือนว่าasync.waterfallจะอนุญาตให้แต่ละฟังก์ชันส่งผลลัพธ์ไปยังฟังก์ชันถัดไปในขณะที่async.seriesส่งผลลัพธ์ทั้งหมดไปยังการเรียกกลับครั้งสุดท้าย ในระดับที่สูงกว่าasync.waterfallจะเป็นไปป์ไลน์ข้อมูล ("ให้ 2, คูณด้วย 3, บวก 2, และหารด้วย 17") ในขณะที่async.seriesสำหรับงานที่ไม่ต่อเนื่องที่ต้องดำเนินการตามลำดับ แต่จะแยกกัน


เป็นไปได้ไหมที่ฟังก์ชันทั้งสองนี้จะส่งคืนค่า ฉันอ่านแล้วว่าเป็นไปได้ แต่ฉันไม่พบข้อมูลที่เกี่ยวข้องจากที่ใดในเอกสาร
Anderson Green

1
@AndersonGreen: ไม่. กำลังมองหาที่มาของไลบรารีทั้งwaterfallมิได้seriesส่งกลับค่า คาดว่าผลลัพธ์จะถูกใช้ในพารามิเตอร์การเรียกกลับที่เป็นทางเลือก
Twisol

คำตอบข้างต้นอาจถูกต้องย้อนกลับไปในปี 2012 แต่คำตอบที่ถูกต้องเหมือนกันกับคำตอบถัดไปนั่นคือ: series () เนื่องจากมีชื่อว่าผลลัพธ์ทั้งหมดเป็นชุดที่ส่งไปยังการเรียกกลับครั้งสุดท้ายและ Waterfall คือผลลัพธ์สุดท้ายที่ส่งไปยัง การโทรกลับครั้งสุดท้าย ดูMozilla Developer
Jeb50

53

ฟังก์ชันทั้งสองส่งค่าส่งคืนของทุกฟังก์ชันไปยังฟังก์ชันถัดไปจากนั้นเมื่อเสร็จสิ้นจะเรียกการเรียกกลับหลักส่งผ่านข้อผิดพลาดหากเกิดข้อผิดพลาด

ความแตกต่างคือasync.series()เมื่อซีรีส์จบลงแล้วจะส่งผ่านผลลัพธ์ทั้งหมดไปยังการเรียกกลับหลัก async.waterfall()จะส่งผ่านไปยังการเรียกกลับหลักเฉพาะผลลัพธ์ของฟังก์ชันสุดท้ายที่เรียก


1
นี่น่าจะเป็นคำตอบ ;-)
Stuart Allen

@Mario "ฟังก์ชันทั้งสองส่งผ่านการเรียกกลับของฟังก์ชันก่อนหน้า" หรือ "ฟังก์ชันทั้งสองส่งผ่านผลลัพธ์ของฟังก์ชันก่อนหน้า"?
user1451111

@ user1451111 ผลลัพธ์ฮ่า ๆ ... ฉันแน่ใจว่าฉันได้เขียนสิ่งนั้นเป็นครั้งแรกแม้ว่า ...

26

async.waterfall()กำลังจัดการกับaction that relies on the previous outcomeไฟล์.

async.series() กำลังจัดการกับการกระทำที่ต้องการ see all the result at the end


1
ภาพที่สร้างขึ้นอย่างยอดเยี่ยม คุณสร้างขึ้นเองหรือหาที่อื่น?
user1451111

คุณควรใส่ภาพลงในคำตอบผู้คนอาจจะคิดถึงพวกเขา o / w
Alexander Mills

1

ฉันคิดว่า 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) => {
     // ...
  }
])

ด้วยวิธีนี้คุณจะไม่ดึงผมออกพยายามทำให้แน่ใจว่าอาร์กิวเมนต์ของฟังก์ชันมีความยาวที่เหมาะสม ฟังก์ชันแรกยอมรับเพียงหนึ่งอาร์กิวเมนต์ - การเรียกกลับ สิ่งที่เหลือทั้งหมดควรยอมรับสองอาร์กิวเมนต์ - ค่าและการเรียกกลับ ยึดติดกับรูปแบบและคุณจะยังคงมีสติ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.