Javascript JS-过滤承诺对象

Javascript JS-过滤承诺对象,javascript,es6-promise,Javascript,Es6 Promise,我一直在尝试过滤我从firebase获得的数据(样本产品)。问题是sampleProducts数据被定义为Promise对象,因为我使用then()方法提取它,如下所示: import fire from "./config/FBConfig" var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {

我一直在尝试过滤我从firebase获得的数据(样本产品)。问题是sampleProducts数据被定义为Promise对象,因为我使用then()方法提取它,如下所示:

import fire from "./config/FBConfig"

var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {
        return Object.values(doc.data());  
});
import { sampleProducts } from './Data'

class Api {
    usePriceFilter = usePriceFilter === 'true' && true
        return new Promise((resolve) => {
            setTimeout(() => {

                let data = sampleProducts.filter(item => {
                    if (
                        usePriceFilter &&
            (item.price < minPrice || item.price > maxPrice)
                    ) {
                        return false
                    }

                    if (category === 'home') {
                        return true
                    }

                    if (category !== 'All categories' && category !== item.category)
                        return false

                    if (term && !item.name.toLowerCase().includes(term.toLowerCase()))
                        return false

                    return true
                })

                let totalLength = data.length
                data = this.sortByPrice(data, sortValue)
                data = data.slice((page - 1) * itemsPerPage, page * itemsPerPage)
                resolve({ data, totalLength })
            }, 500)
        })
    }
}
我尝试像这样过滤数据:

import fire from "./config/FBConfig"

var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {
        return Object.values(doc.data());  
});
import { sampleProducts } from './Data'

class Api {
    usePriceFilter = usePriceFilter === 'true' && true
        return new Promise((resolve) => {
            setTimeout(() => {

                let data = sampleProducts.filter(item => {
                    if (
                        usePriceFilter &&
            (item.price < minPrice || item.price > maxPrice)
                    ) {
                        return false
                    }

                    if (category === 'home') {
                        return true
                    }

                    if (category !== 'All categories' && category !== item.category)
                        return false

                    if (term && !item.name.toLowerCase().includes(term.toLowerCase()))
                        return false

                    return true
                })

                let totalLength = data.length
                data = this.sortByPrice(data, sortValue)
                data = data.slice((page - 1) * itemsPerPage, page * itemsPerPage)
                resolve({ data, totalLength })
            }, 500)
        })
    }
}
从“/Data”导入{sampleProducts}
类Api{
usePriceFilter=usePriceFilter=='true'&&true
返回新承诺((解决)=>{
设置超时(()=>{
让数据=sampleProducts.filter(项=>{
如果(
使用价格过滤器&&
(item.pricemaxPrice)
) {
返回错误
}
如果(类别=='home'){
返回真值
}
如果(类别!='All categories'&&category!==item.category)
返回错误
if(term&&!item.name.toLowerCase().includes(term.toLowerCase()))
返回错误
返回真值
})
设totalLength=data.length
data=this.sortByPrice(数据,sortValue)
data=data.slice((第-1页)*itemsPerPage,第*itemsPerPage页)
解析({data,totalength})
}, 500)
})
}
}
因此,由于sampleProducts是Promise,我无法对其进行过滤,这是控制台中的错误和数据:


我很乐意接受任何帮助或建议。谢谢。

您需要先解决承诺,然后才能对其执行
筛选

如果您只需要一个项目,请考虑使用<代码>查找< /代码>而不是<代码>筛选器< /代码> .< <>排序时,考虑更多的功能性编程风格。我已经更新了示例,演示了如何使用

Array.sort
函数来实现这一点

函数getSampleProducts(){ 还愿([ {id:1,price:2}, {id:2,price:3}, {id:3,price:1}, ]); } const sampleProducts=getSampleProducts(); 函数getItemUsingID(id){ 退回样本产品 。然后(产品=>{ 返回产品。查找(x=>x.id==parseInt(id,12)) }); } 函数getProductsSortedByPrice(页面,页面大小){ 退回样本产品 。然后(产品=>{ 退货 .filter(p=>true/*此处的过滤器逻辑*/) .sort(属性排序器(p=>p.price)) .slice((第1页)*页面大小,页面*页面大小); }); } 函数属性排序器(选择器){ 返回(a,b)=>{ const valA=选择器(a); const valB=选择器(b); 如果(valA>valB){ 返回1; } if(valAconsole.log('getItemUsingID',result)) getProductsSortedByPrice(1,2)
然后(result=>console.log('getProductsOrderedByPrice',result))
它说“sampleProducts.filter”不是一个函数,我会对它进行console.log(sampleProdcuts.filter)或调试,看看它实际上是什么,这是一个承诺。您需要使用then()访问sampleProducts的解析值。感谢您的回复,但我仍然需要在我的代码的另一部分使用filter,我编辑了这篇文章。如果您能提供任何帮助或建议,我将非常高兴使用
filter
。主要建议是,如果您只需要一件物品,请使用
查找
。我已经更新了答案,还包括排序建议。