Синхронизация против Async
Скажем, вы планируете забрать своего друга, чтобы пойти на спортивное событие.Вы не уверены, когда они хотят, чтобы вы пришли, поэтому вы звоните им по телефону и спрашиваете их.Некоторое время они думают об этом, а потом говорят вам время.Вы получили запрошенную информацию, поэтому вы кладете трубку.В терминах программирования это может быть примером синхронного кода (иногда его считают «нормальным» кодом в Node.js).
Верните себя в ту же ситуацию.Однако, когда вы звоните своему другу в этот раз, они очень заняты.Вы не хотите их беспокоить, поэтому попросите их позвонить вам позже.Ты вешаешь, а теперь ждешь.Час спустя они перезвонят и скажут время.Это мыслительный процесс асинхронного кода.
За экраном происходит гораздо больше, но ради простоты я не собираюсь бомбардировать вас всей этой информацией.
Обещания
Объект Promise
представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
The *Метод 1021 *Guild.createRole()
возвращает Обещание.
A Promise
находится в одном из следующих состояний:
- в ожидании :исходное состояние, не выполнено и не отклонено.
- выполнено : означает, что операция завершена успешно.
- отклонено : означает, что операция завершилась неудачно.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
Несмотря на то, что вы вызвали метод для создания роли, он не создается мгновенно.Обещание находится в состоянии в ожидании .
Решения
Итак, как нам получить результат Обещания?Нам нужно подождать.
Сохраняя простой поток, вы можете использовать ключевое слово await
.Все, что он делает, это ждет выполнения или отклонения Обещания, прежде чем продолжить выполнение следующего кода.Рассмотрим следующий пример:
// Asynchronous context (meaning within an async function) needed to use 'await.'
var role = await message.guild.createRole(...);
console.log(role);
// Continue using the 'role' variable...
В качестве альтернативы можно использовать цепочки then()
.Обратный вызов будет вызван с возвращенным значением после выполнения Обещания.В некоторых случаях это просто.Однако обратные вызовы могут очень быстро запутаться, и область действия возвращаемых значений будет ограничена.Рассмотрим этот пример:
message.guild.createRole(...)
.then(role => {
console.log(role);
// Continue using the 'role' variable...
});
Обработка ошибок
Когда обещание отклонено, это означает, что что-то пошло не так.Ошибки, возникающие из-за отклоненных обещаний, должны быть обнаружены.Если это не так, вы получите предупреждение в консоли с ошибкой.
Вы можете присоединить catch()
методы, которые будут работать аналогично then()
, за исключением того, что возвращает ошибку в качестве параметра обратного вызова и вызывается только при отклонении.Рассмотрим сжатый пример:
message.guild.createRole(...)
.then(role => {...})
.catch(console.error);
Вместо того, чтобы присоединять несколько методов catch()
, вы можете использовать оператор try...catch
.Если какие-либо Обещания внутри блока try
отклонены, выполняется код внутри блока catch
.Например:
try {
var role = await message.guild.createRole(...);
await role.delete(); // Maybe not a logical example...
} catch(err) {
console.error(err);
}
Ресурсы