Я хотел поменять фотографию профиля пользователя. Для этого я должен проверить базу данных, чтобы увидеть, если изображение уже было сохранено, если это так, оно должно быть удалено. Затем новый должен быть сохранен и введен в базу данных.
Вот упрощенный (псевдо) код этого:
async function changePic(user, file) {
// remove old pic
if (await database.hasPic(user)) {
let oldPath = await database.getPicOfUser(user);
filesystem.remove(oldPath);
}
// save new pic
let path = "some/new/generated/path.png";
file = await Image.modify(file);
await Promise.all([
filesystem.save(path, file),
database.saveThatUserHasNewPic(user, path)
]);
return "I'm done!";
}
Я столкнулся с следующая проблема с ним:
Если пользователь вызывает API дважды за короткое время, возникают серьезные ошибки. Запросы к базе данных и промежуточные функции являются асинхронными, в результате чего изменения первого вызова API не применяются, когда второй API проверяет профиль pi c для удаления. Таким образом, у меня остался запрос filesystem.remove
на уже несуществующий файл и неснятое изображение в файловой системе.
Я бы хотел безопасно справиться с этой ситуацией, синхронизировав эту критическую часть кода. Я не хочу отклонять запросы только потому, что сервер не завершил предыдущий, и я также хочу синхронизировать его для каждого пользователя, чтобы пользователи не беспокоились о действиях других пользователей.
Есть ли чистый способ добиться этого в JavaScript? Какой-нибудь монитор , как вы знаете из Java, был бы неплох.