JS - 过滤 Promise 对象

JS - Filtering Promise object

我一直在尝试过滤从 firebase 获得的数据 (sampleProducts)。问题是 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)
        })
    }
}

所以由于 sampleProducts 是 Promise 我无法过滤它,这是错误和控制台中的数据: error + data

我们很乐意提供任何帮助或建议。谢谢。

您需要先解析承诺,然后才能对其执行 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))