Проще говоря, find
не ожидает возврата обещания, потому что оно не предназначено для асинхронных вещей. Он перебирает массив, пока один из элементов не приведет к возвращению истинного значения. Объект, включая объект обещания, является правдивым, и поэтому поиск останавливается на первом элементе.
Если вам нужен асинхронный эквивалент find, вам нужно написать его самостоятельно. Вам следует подумать о том, хотите ли вы запускать вещи параллельно или блокировать их последовательно, блокируя перед переходом к следующему индексу.
Например, вот версия, которая запускает их все параллельно, а затем, когда все обещания разрешены, она находит первую, которая дала истинное значение.
async function findAsync(arr, asyncCallback) {
const promises = arr.map(asyncCallback);
const results = await Promise.all(promises);
const index = results.findIndex(result => result);
return arr[index];
}
//... to be used like:
findAsync(arr, async (thing) => {
const ret = await findThing();
return false;
})