Fluture: bagaimana penanganan null ditangani menggunakan Monads

Saya baru mengenal pemrograman fungsional dan saya menemukan contoh pemrograman fungsional fluture berikut yang tampaknya memberikan contoh yang sangat bagus untuk menangani kueri basis data dan manipulasi data selanjutnya. Namun peringatannya adalah bahwa dalam membaca tentang konsep pemrograman fungsional, monad Just/Nothing tampaknya merupakan pendekatan yang disarankan untuk menangani pemeriksaan nol. 1) Bagaimana hal itu cocok dengan contoh ini dan 2) jika findOne ditolak, apakah ini akan menghentikan jalannya rantai berikutnya dan segera menuju ke percabangan?

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))

Saya mendapatkan contoh ini dari tautan stackoverflow berikut dan memodifikasi fromPromise menjadi encaseP:

Cara membuat keduanya Monad memperhatikan fungsi Async (Janji/Masa Depan)

Saya berasumsi bahwa encaseP akan menggantikan fromPromise dalam contoh mereka dalam mengubah Janji menjadi Masa Depan.


person user1790300    schedule 05.03.2021    source sumber


Jawaban (1)


Sebenarnya, Mungkin (Tidak Ada | Hanya) sering kali bukan yang Anda inginkan untuk menangani kesalahan karena, meskipun ini dapat membantu Anda melakukan hubungan arus pendek pada operasi berikutnya dan memberi Anda kaitan untuk memberikan nilai default, ini tidak akan memberi tahu Anda mengapa komputasi bisa belum lengkap.

Salah satunya (Kiri | Kanan) memberi Anda fitur yang sama tetapi juga memungkinkan Anda mengakses konteks yang menyebabkan aliran Anda mengambil cabang kesalahan karena Left juga menyimpan data, seperti pesan kesalahan, yang berguna untuk memulihkan dari kesalahan, mencatat, atau menampilkan informasi berguna pesan kepada pengguna.

Fluture memberi Anda asinkron. Karena async, Anda tidak dapat mengambil nilainya secara langsung (seperti yang biasa Anda lakukan dengan Janji) tetapi selain itu, perilakunya sama dengan Mungkin/Salah satu: fork setara dengan fold. Anda akan mengalami hubungan arus pendek dan banyak lagi (seperti mengganti jalur, memetakan cabang penolakan, dll.).

Ada pengantar yang bagus di sini https://dev.to/avaq/fluture-a-function-alternative-to-promises-21b

person geoffrey    schedule 05.03.2021
comment
Jadi, Entah memberi Anda kemampuan untuk memanfaatkan menunggu/async di dalam pipa? - person user1790300; 07.03.2021
comment
Anda dapat menggunakan helper promise alih-alih fork jika Anda ingin menjalankan komputasi Masa Depan sebagai Janji dan dapat melakukan await, tetapi kemudian Anda kehilangan kemampuan untuk membatalkannya dan pengecualian akan dicampur dengan cabang penolakan, jadi yang terbaik adalah berlatihlah untuk menggunakan banyak fitur pemrograman kereta api Fluture sebanyak mungkin dan mungkin menjalankan komputasi sebagai Promise di bagian paling ujung program Anda jika perlu. Lagi pula, Anda tidak dapat menyusun Promises dan Futures karena Promises bersifat bersemangat, sedangkan Futures bersifat malas: saat Anda bekerja dengan Fluture, semua yang Anda tulis hanyalah angan-angan hingga Anda melakukan fork. - person geoffrey; 07.03.2021