gpt4 book ai didi

javascript - 如何让 Either Monads 知道异步函数(Promises/Future)

转载 作者:行者123 更新时间:2023-11-29 15:24:11 25 4
gpt4 key购买 nike

我正在尝试使用 Either Monad 来传输我的数据,问题是我不知道如何让我的 Monad 知道异步操作

这是我的

let processData = Either.either(_sendError, _sendResponse)

processData(_getDataGeneric(queryResult)
.chain(_findDevice)
.chain(_processRequest)
);

queryResult 是我从数据库本身获取的结果。

问题是获取结果只在管道的中间。我要的是这个

ValidateUserInput -> GetDataFromDB -> ProcessData

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


//_fetchFromDB , Mongoose Query
function _fetchFromDB(userId){
return myModel.findOne({id:userId}).exec()
.then(function(result){
return Right(result)
}).catch((err)=>Left(err))
}

如果来自数据库的结果是有效的,它将返回一个 Right 实例,如果有任何类型的错误,它将返回 Left

问题是这个操作是异步的,我不确定如何让我的 Either Monad 处理它。

关于如何让我的 Monad 在其操作中了解 Promises 有什么想法吗?

最佳答案

如您所见,Either 类型只能表示已经实现的值,而异步操作表示可能在将来评估的值。

Promise 已经结合了 Either 的行为,通过表示错误值和成功值的可能性。它还通过允许 then 返回另一个 Promise 实例来捕获单子(monad)式操作链的行为。

但是,如果您对类似于 Promise 的东西感兴趣,它的行为更接近于 Either(并且还遵循 Fantasy Land 规范),那么您可能会喜欢查看 Future 实现之一,例如 Fluture

例如

import Future from 'fluture';

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

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

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

关于javascript - 如何让 Either Monads 知道异步函数(Promises/Future),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41152736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com