gpt4 book ai didi

javascript - Bluebird promise 过滤器。为什么是数组?

转载 作者:行者123 更新时间:2023-12-02 14:28:29 25 4
gpt4 key购买 nike

看起来我错过了 JS Promise 的一些重要内容。为什么 Promise 的 filter 方法认为 Promise 内容是 Array/Iterable?是不是看起来很不直观?

这是 Bluebird 的过滤器签名:

Promise.filter(
Iterable<any>|Promise<Iterable<any>> input,
function(any item, int index, int length) filterer,
[Object {concurrency: int=Infinity} options]
) -> Promise

标准库中至少有一种语言具有 Future/Promise,并且 Promise.filter 接受谓词并返回 Resolved 往往是非常合乎逻辑的> 如果内容满足所提供的谓词,则 promise ;如果不满足,则拒绝并出现一些错误:

Promise.filter(
<any>|Promise<any> input,
function (any item) predicate
) -> Promise

使用方法如下:

getUserFromDatabase()
.filter( user => user.isEmailValid )
.then(
user => { req.statusCode = 200; } // user is okay
err => { req.statusCode = 404; } // user is not okay
)

最佳答案

在 monad 的上下文中,“过滤”的含义有两种可能的直觉。 Haskell 实际上非常清楚地说明了这一点,因为它确实有两个不同的函数:

mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

Direct MonadPlus equivalent of filter applicable to any MonadPlus, for example mfilter odd (Just 1) == Just 1, mfilter odd (Just 2) == Nothing

“直接等价”的意思是 filter = (mfilter::(a -> Bool) -> [a] -> [a]),即 mfilterm 实例化为 [],就像 map = fmap 一样。

filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]

This generalizes the list-based filter function.

它甚至可以从列表推广到任何可折叠和 Monoid 的东西,但让我们保持简单。

这两个函数都可以应用于 Promise,它是 MonadPlus 的一个实例。 Scala 选择了第一个,Bluebird 选择了第二个。

这是因为 mfilter 可以通过 JavaScript 中的 .then(x => { if (predicate(x)) return x else throw … }) 非常简单地实现,您甚至可以在同一个回调中选择一条错误消息或对 x 应用进一步的转换。相比之下,高效的 filterM 并不那么容易实现,但仍然非常有用并且经常需要,因此 Bluebird 将其作为其集合实用带的一部分提供 - 包括并发 在这些方法中找到的选项。

关于javascript - Bluebird promise 过滤器。为什么是数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38037691/

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