У меня есть некоторые функции, которые извлекают имена файлов изображений профиля для каждого пользователя в моем приложении. Допустим, мне нужны изображения профиля для 10 пользователей. Мое приложение будет делать 10 запросов к серверу.
Однако я понял, что это действительно неэффективно, поэтому решил написать функцию, которая принимает массив путей и возвращает имя файла для изображения в каждом из них. пути.
Я сохраняю изображение профиля каждого пользователя в каталоге, который соответствует их идентификатору пользователя, например /some/path/userid/profile-image.jpg
Вот как выглядит упрощенная функция:
getProfilePhotoFileNamesForUsers: async (server, request) => {
var imageFilesArray = [];
try {
for await (const userId of userIdsArray) {
const path = `${process.cwd()}/uploads/${userId}`;
Fse.exists(path, async (exists) => {
if (exists) {
const fileName = await Fse.readdir(`${process.cwd()}/uploads/${userId}`);
let fileNameObject = {
user_id: userId,
file_name: fileName[0]
};
imageFilesArray.push(fileNameObject);
} else {
let fileNameObject = {
userId: userId,
fileName: undefined
};
imageFilesArray.push(fileNameObject);
}
});
};
return imageFilesArray
}
catch(error) {
console.log(error)
}
}
Изначально я использовал forEach
, но обнаружил, что sync / await не работает с таким типом для l oop. ImageFilesArray всегда возвращался до завершения forEach l oop.
В итоге я использовал for-of
l oop, который вы видите выше. Однако результат все тот же. Массив обновляется, но его переменная всегда возвращается до начала for-of l oop.
Я также пробовал использовать обещания, но результат тот же. Вот почему мне интересно, поступаю ли я неправильно.
Есть ли способ, которым я могу просто предоставить массив путей (построенных путем предоставления массива идентификаторов пользователей) и получить обратно массив совпадающих каталогов, которыми я могу управлять? Это означало бы, что мне не нужно использовать for-l oop.