У меня есть библиотека бизнес-логики с методом, предназначенным для асинхронной работы, с передачей false для использования в операторе if.Если асинхронный запуск, все нормально:
const permissions = new PermissionProvider(userId,appId);
if(await permissions.ifAllowed('invalid action', itemID)){
// This code is not reachable.
}
export class PermissionProvider {
...
public async ifAllowed(action: string, itemId?: string): Promise<boolean> {
return await db.query(params)
.then(() => { return false; }
}
Однако я обеспокоен тем, что кто-то может случайно запустить код синхронно:
if(permissions.ifAllowed('invalid action', itemID)){
// This code executes because asynchronous functions return a Promise,
// and objects evaluate to true.
}
Просто документирование того, что API должен быть запущен с асинхронным/ ожидание кажется ненадежным.Это особенно плохо, потому что может быть неочевидно, что конечному пользователю будет разрешено делать практически все, если ключевое слово await опущено.
Если я возвращаю примитивное логическое значение, тогда асинхронный код возвращает неопределенное значение, потому чтоон поступает из базы данных как обещание.
Есть ли хороший обходной путь либо для принудительного выполнения асинхронных вызовов для потребителя API, либо для предотвращения выражения if оператором true?
Я пытался выдать неперехваченную ошибку, но он все еще выполняет код, потому что ошибка генерируется после того, как оператор if уже выполнен.