Fluture: การจัดการ null ควรได้รับการแก้ไขอย่างไรโดยใช้ Monads

ฉันยังใหม่กับการเขียนโปรแกรมเชิงฟังก์ชัน และฉันพบตัวอย่างการเขียนโปรแกรมเชิงฟังก์ชัน fluture ต่อไปนี้ ซึ่งดูเหมือนว่าจะเป็นตัวอย่างที่ดีจริงๆ ในการจัดการคำสั่งฐานข้อมูลและการจัดการข้อมูลที่ตามมา อย่างไรก็ตาม ข้อแม้ก็คือในการอ่านเกี่ยวกับแนวคิดการเขียนโปรแกรมเชิงฟังก์ชัน ดูเหมือนว่า Just/Nothing monads จะเป็นแนวทางที่แนะนำสำหรับการจัดการการตรวจสอบค่าว่าง 1) สิ่งนี้จะเข้ากับตัวอย่างนี้ได้อย่างไร และ 2) หาก findOne ปฏิเสธ มันจะหยุด chains ที่ตามมาไม่ให้ทำงานและไปที่ fork ทันทีหรือไม่

import Future from 'fluture';

const processAll = Future.fork(_sendError, _sendResponse);

const _fetchFromDB =
    encaseP(userId => myModel.findOne({ id: userId }).exec())
  //Future.fromPromise(userId => myModel.findOne({ id: userId }).exec())

processAll(_fetchFromDB(userId)
  .chain(getDataGeneric)
  .chain(_findDevice)
  .chain(_processRequest))

ฉันได้รับตัวอย่างนี้จากลิงก์ stackoverflow ต่อไปนี้ และแก้ไข fromPromise เป็น encaseP:

วิธีทำอย่างใดอย่างหนึ่ง Monads ตระหนักถึงฟังก์ชัน Async (สัญญา/อนาคต)

ฉันคิดว่า encaseP จะแทนที่ fromPromise ในตัวอย่างของพวกเขาในการแปลง Promise เป็น Future


person user1790300    schedule 05.03.2021    source แหล่งที่มา


คำตอบ (1)


ที่จริงแล้ว บางที (ไม่มีอะไร | เพียงแค่) มักจะไม่ใช่สิ่งที่คุณต้องการสำหรับการจัดการข้อผิดพลาด เพราะถึงแม้ว่ามันจะช่วยให้คุณลัดวงจรการดำเนินการในภายหลัง และช่วยให้คุณระบุค่าเริ่มต้นได้ แต่จะไม่บอกคุณว่าทำไมการคำนวณถึงทำได้ ไม่สมบูรณ์.

อย่างใดอย่างหนึ่ง (ซ้าย | ขวา) ให้คุณสมบัติเดียวกันแก่คุณ แต่ยังช่วยให้คุณเข้าถึงบริบทที่ทำให้โฟลว์ของคุณรับสาขาข้อผิดพลาดเนื่องจาก Left เก็บข้อมูลไว้เช่นกัน เช่น ข้อความแสดงข้อผิดพลาด ซึ่งมีประโยชน์สำหรับการกู้คืนจากข้อผิดพลาด การบันทึก หรือการแสดงที่มีประโยชน์ ข้อความถึงผู้ใช้

Fluture ให้ async แก่คุณเช่นกัน เนื่องจากเป็นแบบอะซิงก์ คุณจึงไม่สามารถดึงค่าได้โดยตรง (ตามที่คุณคุ้นเคยกับ Promises) แต่นอกเหนือจากนั้นมันยังทำงานเหมือนกับบางที/อย่างใดอย่างหนึ่ง: fork เทียบเท่ากับ fold คุณจะเกิดการลัดวงจรและอื่นๆ อีกมากมาย (เช่น การเปลี่ยนแทร็ก การทำแผนที่เหนือสาขาการปฏิเสธ ฯลฯ)

มีการแนะนำที่ดีที่นี่ https://dev.to/avaq/fluture-a-function-alternative-to-promises-21b

person geoffrey    schedule 05.03.2021
comment
ดังนั้นอย่างใดอย่างหนึ่งทำให้คุณสามารถใช้ await/async ในไปป์ไลน์ได้หรือไม่ - person user1790300; 07.03.2021
comment
คุณสามารถใช้ตัวช่วย promise แทน fork หากคุณต้องการเรียกใช้การคำนวณในอนาคตตามสัญญาและสามารถ await ได้ แต่จากนั้น คุณจะสูญเสียความสามารถในการยกเลิกและข้อยกเว้นจะผสมกับสาขาการปฏิเสธ ดังนั้นจึงเป็นการดีที่สุด ฝึกฝนการใช้คุณสมบัติการเขียนโปรแกรมรถไฟมากมายของ Fluture ให้มากที่สุดเท่าที่จะเป็นไปได้ และอาจเรียกใช้การคำนวณตามสัญญาที่ขอบสุดของโปรแกรมของคุณหากคุณต้องการ คุณไม่สามารถซ้อน Promises และ Futures ไว้ได้อยู่แล้ว เพราะ Promises นั้นกระตือรือร้น ในขณะที่ Futures นั้นขี้เกียจ: เมื่อคุณทำงานกับ Fluture ทุกสิ่งที่คุณเขียนจะเป็นการคิดอย่างปรารถนาจนกว่าคุณจะแยกออก - person geoffrey; 07.03.2021