โมดูล 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) => {
     // ...
  }
])
ด้วยวิธีนี้คุณจะไม่ดึงผมออกพยายามทำให้แน่ใจว่าอาร์กิวเมนต์ของฟังก์ชันมีความยาวที่เหมาะสม ฟังก์ชันแรกยอมรับเพียงหนึ่งอาร์กิวเมนต์ - การเรียกกลับ สิ่งที่เหลือทั้งหมดควรยอมรับสองอาร์กิวเมนต์ - ค่าและการเรียกกลับ ยึดติดกับรูปแบบและคุณจะยังคงมีสติ!