JavaScript 中的异步内部过滤器函数
Async inside filter function in JavaScript
const result = [1, 2, 3, 4, 5].filter(async (n) => n <= 3)
如果你 console.log(结果),你会得到 [1, 2, 3, 4, 5]。为什么不是 [1, 2, 3]?
如果您从函数中删除异步,您会得到 [1, 2, 3]。
我只是想知道为什么会这样。
filter
使用原始数组中的所有值创建一个新数组,其中您传递的函数 return 是一个 true 值。
async
履行 return 承诺。承诺是对象。对象是 true 值。
如果您想使用异步函数执行此操作,则需要等到解决了 promise 之后再测试真实性。
!async function() {
const data = [1, 2, 3, 4, 5];
const promises = data.map(async(n) => ({
value: n,
include: n <= 3
}));
const data_with_includes = await Promise.all(promises);
const filtered_data_with_includes = data_with_includes.filter(v => v.include);
const filtered_data = filtered_data_with_includes.map(data => data.value);
console.log(filtered_data);
}();
或者,在不解释每个步骤的格式中:
!async function() {
const result = (await Promise.all([1, 2, 3, 4, 5].map(async(n) => ({
value: n,
include: n <= 3
})))).filter(v => v.include).map(data => data.value);
console.log(result);
}();
您也可以避免在 for
循环
中使用有利于突变的功能方法
!async function() {
const test = async(n) => n <= 3;
const data = [1, 2, 3, 4, 5];
const result = [];
for (let i = 0; i < data.length; i++) {
const value = data[i];
if (await test(value)) result.push(value);
}
console.log(result);
}();
const result = [1, 2, 3, 4, 5].filter(async (n) => n <= 3)
如果你 console.log(结果),你会得到 [1, 2, 3, 4, 5]。为什么不是 [1, 2, 3]?
如果您从函数中删除异步,您会得到 [1, 2, 3]。
我只是想知道为什么会这样。
filter
使用原始数组中的所有值创建一个新数组,其中您传递的函数 return 是一个 true 值。
async
履行 return 承诺。承诺是对象。对象是 true 值。
如果您想使用异步函数执行此操作,则需要等到解决了 promise 之后再测试真实性。
!async function() {
const data = [1, 2, 3, 4, 5];
const promises = data.map(async(n) => ({
value: n,
include: n <= 3
}));
const data_with_includes = await Promise.all(promises);
const filtered_data_with_includes = data_with_includes.filter(v => v.include);
const filtered_data = filtered_data_with_includes.map(data => data.value);
console.log(filtered_data);
}();
或者,在不解释每个步骤的格式中:
!async function() {
const result = (await Promise.all([1, 2, 3, 4, 5].map(async(n) => ({
value: n,
include: n <= 3
})))).filter(v => v.include).map(data => data.value);
console.log(result);
}();
您也可以避免在 for
循环
!async function() {
const test = async(n) => n <= 3;
const data = [1, 2, 3, 4, 5];
const result = [];
for (let i = 0; i < data.length; i++) {
const value = data[i];
if (await test(value)) result.push(value);
}
console.log(result);
}();