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))
我一直在尝试过滤从 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))