【发布时间】:2018-04-16 03:23:25
【问题描述】:
背景
我正在尝试过滤一组对象。在过滤之前,我需要将它们转换为某种格式,并且这个操作是异步的。
const convert = () => new Promise( resolve => {
setTimeout( resolve, 1000 );
});
所以,我的第一次尝试是使用 async/await 执行以下操作:
const objs = [ { id: 1, data: "hello" }, { id: 2, data: "world"} ];
objs.filter( async ( obj ) => {
await convert();
return obj.data === "hello";
});
现在,你们中的一些人可能知道,Array.protoype.filter 是一个回调函数必须返回 true 或 false。 filter 是同步的。在前面的示例中,我没有返回任何一个,我返回一个 Promise (所有异步函数都是 Promises )。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
所以可以假设,之前的代码并不能真正工作......这个假设是正确的。
问题
为了使过滤器与异步函数一起工作,我检查了 stackoverflow 并找到了这个主题:
Filtering an array with a function that returns a promise
不幸的是,选择的答案过于复杂并且使用类。这对我不行。相反,我正在寻找一个更简单的解决方案,使用带有功能方法的简单函数。
最后有一个解决方案,使用带有回调的地图来模拟过滤器:
https://stackoverflow.com/a/46842181/1337392
但我希望修复我的过滤功能,而不是替换它。
问题
- 有没有办法在过滤器中使用异步函数?
- 如果不是,我能做的最简单的替换是什么?
【问题讨论】:
-
您可以使用现有的异步过滤器功能,例如array-async-filter,或者自己编写。
-
看起来内置过滤器功能在后台使用
Function.call()来执行您的过滤器功能。这似乎可能会通过不调用await来打破 async/await 位
标签: javascript arrays filter async-await