问题描述
我有一个flatMap函数,可获取并返回数组中每个项目的数据。如果item没有某些信息,它也会返回一个空数组。自从我使用flatMap以来,我一直期望它会删除所有空数组,但完成的数组仍包含它们。
功能:
Promise.all(
array.flatMap(async (item) => {
const fetchedData = await fetch(`${item.url}`)
.then(response => response.json())
.then(data => data.stats.length ? data : null);
return fetchedData ? { ...fetchedData } : [];
})).then(data => console.log(data));
此外,当我使用 console.log(data.flat())而不是 console.log(data)记录数据时,所有空数组均被删除,但是它将需要遍历数组一次。有什么想法为什么flatMap不能自己做?
解决方法
这是因为你在 flatMap
中的回调是一个 async
函数,所以无论如何它总是返回一个 Promise。假设 array
有两个项目,第一个将获取数据,第二个不获取数据,以下是将发生的情况的示例:
array
是:[item1,item2]
在 flatMap
的映射部分之后,您会得到 [Promise(pending),Promise(pending)]
(请注意,映射是即时的,它不会等待异步函数完成,它只是从它们那里获得承诺)。
在展平部分之后,您会得到 [Promise(pending),Promise(pending)]
(请注意,这与上面的行相同 - 承诺不能展平。)。
Promise.all.then() 等待每个 promise 得到解决,并将结果作为 data
传递,您记录的结果是 [someObject,emptyArray]
。