У меня есть 6 объектов в массиве, поэтому мне нужно их отфильтровать. Проблема в том, что в фильтре я получаю false для каждого 6 объекта, в этом случае я должен получить пустой массив, но не получаю пустой массив. Не фильтрует, не знаю почему?...
const result = await Promise.all(
pricesForEachProductTogether.filter(async (finalResult) => {
const pkgHaveMultiDay: boolean = await filterFinalResultByTravelMultiDay(
finalResult,
multiDay
)
if (pkgHaveMultiDay) {
return true
}
return false
})
)
return result
Это мой код фильтра. Итак, в этом случае я получаю 6 false в pkgHaveMultiDay, поэтому результатом должен быть пустой массив. Но я получаю свои объекты... Он не фильтрует. Почему?
Вы не можете использовать асинхронную функцию внутри фильтра напрямую. Оформить заказ этот пост для получения дополнительной информации
работает именно так, как описано на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Момент с вашим кодом заключается в том, что filter
не поддерживает асинхронные функции, поэтому, когда вы вводите ключевое слово async
, вы буквально заставляете свою функцию возвращать обещание (разрешенное с возвращаемым вами значением), которое рассматривается как true
(как и любой другой объект)
"Момент с вашим кодом" Я никогда не слышал, чтобы "момент" употреблялся таким образом.
Имея его как функцию async
, вы всегда будете возвращать Promise
, потому что так работают асинхронные функции. Синхронный характер Array.prototype.filter
означает, что он не будет пытаться ждать обещаний для вас, он просто копирует истинные значения и игнорирует ложные значения. Обещания всегда правдивы, поэтому, даже если это Promise<false>
, оно будет действовать как true
при преобразовании самого обещания в логическое значение.
Чтобы исправить это, создайте отдельный массив логических значений, чтобы сохранить их, используя от Promise.all
до await
все внутренние промисы, а затем отфильтруйте с помощью этого логического массива.
const shouldKeepResult = await Promise.all(pricesForEachProductTogether.map(async(finalResult) => {
const pkgHaveMultiDay = await filterFinalResultByTravelMultiDay(
finalResult,
multiDay
);
return pkgHaveMultiDay;
}));
const result = pricesForEachProductTogether.filter((_, i) => shouldKeepResult[i]);
return result;
Большое спасибо, да, это сработало. Спасибо, что объяснили, почему не работает.
filter
должен вернутьboolean
. Если вы возвращаете обещание, оно считается истинным значением.