Javascript 蓝鸟承诺过滤器。为什么是阵列?

Javascript 蓝鸟承诺过滤器。为什么是阵列?,javascript,bluebird,es6-promise,Javascript,Bluebird,Es6 Promise,看来我错过了一些重要的JS承诺。为什么Promise的filter方法认为Promise内容是数组/Iterable?这看起来不是很直观吗 以下是蓝鸟的过滤器签名: Promise.filter( Iterable<any>|Promise<Iterable<any>> input, function(any item, int index, int length) filterer, [Object {concurrency: int=Infin

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

以下是蓝鸟的过滤器签名:

Promise.filter(
  Iterable<any>|Promise<Iterable<any>> input,
  function(any item, int index, int length) filterer,
  [Object {concurrency: int=Infinity} options]
) -> Promise
这就是它的使用方法:

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

有两种可能的直觉,“过滤”在单子的上下文中可能意味着什么。Haskell非常清楚地说明了这一点,因为它确实有两个不同的功能:

这概括了基于列表的过滤函数

它甚至可以从列表中推广到任何既可折叠又是幺半群的东西,但让我们保持简单

这两个函数都可以应用于承诺,承诺是
MonadPlus
的一个实例。斯卡拉选了第一只,蓝鸟选了第二只


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

Promise.filter()
是根据,不是在Scala之后。@robertklep,而是承诺与数组的关系如何?即使将两者都视为通用容器,对包含的值应用过滤似乎是合乎逻辑的,而不是对可能是数组的值应用过滤?还是我错了?
Promise.filter()
在这里描述得很好。这是一个根据一系列承诺进行操作的函数。这就是它构建的目的。@AlexPovar使用JS中相对常见的承诺数组(因此存在)。仍然可以显式地(通过在值不匹配时抛出)对特定值进行过滤。与往常一样,关于任何语言的任何问题都可以用Haskell中的两个OneLiner来回答:)
getUserFromDatabase()
  .filter( user => user.isEmailValid )
  .then( 
    user => { req.statusCode = 200; }  // user is okay
    err  => { req.statusCode = 404; }  // user is not okay
  )
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]