Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺的功能操作(如筛选)_Javascript_Promise_Bluebird - Fatal编程技术网

Javascript 承诺的功能操作(如筛选)

Javascript 承诺的功能操作(如筛选),javascript,promise,bluebird,Javascript,Promise,Bluebird,我同时执行几个查询,并从中创建一系列承诺。我希望生成的数组仅具有查询返回的某些属性,并且我希望过滤其他属性(但这些操作实际上可以是任何操作)。目前,我有: Promise.all(Ids.map(Id => query(Id) .then(result => result.Item) )).then(results => results.filter(Boolean)); 内部结果。Item仍然是并行完成的,所以我认为这是可以的,但我不喜欢这样,原因有两个: 我有一个内部

我同时执行几个查询,并从中创建一系列承诺。我希望生成的数组仅具有查询返回的某些属性,并且我希望过滤其他属性(但这些操作实际上可以是任何操作)。目前,我有:

Promise.all(Ids.map(Id => query(Id)
  .then(result => result.Item)
)).then(results => results.filter(Boolean));
内部
结果。Item
仍然是并行完成的,所以我认为这是可以的,但我不喜欢这样,原因有两个:

  • 我有一个内部/嵌套的承诺链,我想将其展平
  • 外部筛选必须等待所有承诺完成(预期),然后迭代整个结果(错误)。最好不要首先添加空项

  • 有没有一种更好的方法可以对承诺集合执行功能操作?

    一种方法是使用反应式扩展库,它提供了一种将不同的异步模型集成到概念“流”模型中的方法。例如,上面的代码(假设
    Ids
    是一个数组,
    query
    返回一个承诺)将变成:

    Observable.from(Ids)
        .flatMap(id => query(id))
        .map(result => result.Item)
        .filter(item => item.filterByThis) // Not sure what Boolean is supposed to be in your code
        .toArray();
    
    假设
    Ids
    是一个
    number[]
    ,我们首先生成一个
    可观察的
    ,然后通过各种熟悉的操作符来转换和过滤流,然后最后使用
    toArray
    获得一个可观察的对象,该对象发出一个数组,该数组的类型为
    结果


    您可以将可观察性视为对异步操作的承诺概念的概括,异步操作返回任意数量的值,而不仅仅是一个值。这是一个强大的范例,Rx库在许多语言中都非常流行。您可以阅读更多关于它的信息,或者开始使用npm软件包。

    1有很多错误。您也没有尝试为
    循环“展平”
    ,是吗?可能要切换到Rx@Bergi
    映射
    /iterative/loop片段不是我想要展平的。我认为flatte是一个错误的词,但我的问题是内部承诺链(
    。然后,
    )@ExplosionPills:内部链(在
    映射
    回调中)就是循环体。这里没有什么可压扁的。你可以尝试
    async
    /
    wait
    或者蓝鸟
    Promise.coroutine
    ,如果你不想链接的话。顺便说一句,
    Boolean
    只是JavaScript中的布尔构造函数,所以
    .filter(Boolean)
    只是编写
    的一种方式。filter(item=>Boolean(item))
    或者
    filter(item=>!!.item)
    在您的示例中,如何生成可观察的
    const Observable=require(“rxjs”)。Observable
    ?@ExplosionPills取决于您使用的是哪一种。如果您使用的是RxJS 5,那么您应该执行
    const Observable=require('RxJS/Rx')。Observable。我认为RXJS4有点不同。最好的地方是查看github自述:。这里还有一个gitter聊天室:如果你在发射时遇到麻烦,那里会有一些非常有用的人。