如何在Lodash的find方法中使用async/await?为何条件不满足仍返回匹配项?
问题原因
Lodash的find是同步方法,它不会处理异步回调函数。你传入的async (item) => {...}会返回一个Promise对象,而在JavaScript里,Promise属于“真值”(truthy)——不管内部最终resolve成true还是false,这个Promise本身在判断时都会被当成true。所以find会直接把数组的第一个元素判定为匹配项返回,完全不会等你的await someFunction()执行完毕。
解决办法
要处理异步逻辑的查找,别用Lodash的同步find,改用原生的异步遍历方式,比如for...of循环:
let isTravelerActiveChannelVac = false; for (const item of array) { const isInputEnabled = await someFunction(); if (item && isInputEnabled) { isTravelerActiveChannelVac = true; break; // 找到匹配项就停止遍历 } }
如果想要类似Lodash的批量处理写法,也可以用Promise.all先处理所有异步判断,再用原生方法校验:
const results = await Promise.all( array.map(async (item) => { const isInputEnabled = await someFunction(); return item && isInputEnabled; }) ); const isTravelerActiveChannelVac = results.some(Boolean);
不过这种方式会遍历整个数组并执行所有的someFunction(),不像for...of可以中途终止遍历,所以如果数组很大或者someFunction()是耗时操作,优先选第一种方案。
内容的提问来源于stack exchange,提问作者Saket Kumar
相关产品推荐
相关产品推荐

