TypeScript Условная логика на Promise <boolean>позволяет выполнять код при синхронном запуске - PullRequest
0 голосов
/ 27 августа 2018

У меня есть библиотека бизнес-логики с методом, предназначенным для асинхронной работы, с передачей 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 уже выполнен.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Если вам нужно использовать внешний ввод / вывод, например, в этом случае вы не можете работать на 100% синхронно.В дополнение к этому, я не могу принудить использовать await, потому что пропуская это 100% действительный код.Это никогда не является проблемой, в том числе и для младшего разработчика node.js / JS, потому что асинхронный код есть везде.Просто документируйте свой API, и все будет хорошо.

0 голосов
/ 27 августа 2018

Есть ли хороший обходной путь для принудительного выполнения асинхронных вызовов для потребителя API или для предотвращения выражения оператора if в true?

Можно включить строгие логические выражения в цлинте: https://palantir.github.io/tslint/rules/strict-boolean-expressions/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...