JS-过滤承诺对象

问题描述 投票:1回答:1

我一直在尝试过滤我从firebase获得的数据(sampleProducts)。问题在于,由于我使用then()方法来提取sampleProducts数据为Promise对象,如下所示:

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)
        })
    }
}

因此,由于sampleProducts是Promise,因此我无法过滤它,这是错误,并且控制台中的数据:error + data

将很高兴获得任何帮助或建议。谢谢。

javascript es6-promise
1个回答
1
投票

您必须先兑现承诺,然后才能对其执行filter

如果只需要一个项目,请考虑使用find而不是filter

[排序时,请考虑遵循更多的编程功能样式。我已经更新了示例,以显示如何使用Array.sort函数来实现此目的。

function getSampleProducts() {
  return Promise.resolve([
    {id: 1, price: 2},
    {id: 2, price: 3},
    {id: 3, price: 1},
  ]);
}

const sampleProducts = getSampleProducts();

function getItemUsingID(id) {
  return sampleProducts
    .then(products => {
      return products.find(x => x.id === parseInt(id, 12))
    });      
}

function getProductsSortedByPrice(page, pageSize) {
  return sampleProducts
    .then(products => {
      return products
        .filter(p => true /* filter logic here */)
        .sort(propertySorter(p => p.price))
        .slice((page - 1) * pageSize, page * pageSize);
    });
}

function propertySorter(selector) {
  return (a, b) => {
    const valA = selector(a);
    const valB = selector(b);

    if (valA > valB) {
      return 1;
    }
    if (valA < valB) {
      return -1;
    }
    return 0;
  }
}

getItemUsingID('1')
  .then(result => console.log('getItemUsingID', result))
  
getProductsSortedByPrice(1, 2)
  .then(result => console.log('getProductsSortedByPrice', result))
© www.soinside.com 2019 - 2024. All rights reserved.