#javascript #asynchronous #async-await
#javascript #асинхронный #async-ожидание
Вопрос:
РЕДАКТИРОВАТЬ: Больше не могу воспроизвести это поведение, но это происходило в node версии 14.7.0. Все возвращается в нормальное русло, я могу просто передать обычный обратный вызов () => <AsyncFunction>()
, и это работает… Возможно, что-то пошло не так в среде отладки, которую я использую, и она не загрузила обновленный код, я не знаю.
Я думал, что наличие async () => <function>()
синтаксиса создаст функцию, которая затем помещается в массив interruptRunner
, вместо этого она немедленно выполняется и, следовательно, помещает обещание в массив.
Я не понимаю, почему это так, оно не должно выполняться. Заключение в квадратные скобки async () => (<function>())
возвращаемого типа решает проблему, но я не уверен, почему это было выполнено в первую очередь. Я думал, что немедленное выполнение возможно только с IFFE.
const interruptRunner = async actions => {
for (let action of actions) {
await action();
}
};
// Didn't work, is the solution though
await interruptRunner([
() => sleep(2 * 1000),
...
]
// Didn't work, executed like IFFE
return await interruptRunner([
async () => await ticket.origMsg.author.send(msg),
async () => await sleep(60 * 1000),
...
// Worked, functions were received instead of pending promises
await interruptRunner([
async () => {
await ticket.origMsg.author.send(msg);
},
...
// Works, but with not needed asyncs
await interruptRunner([
async () => (await sleep(2 * 1000)),
async () => (await sleep(2 * 1000)),
]);
Комментарии:
1. Что
interruptRunner
? Это не определено для меня в Node или моем браузере, и поиск по нему не выдает ничего явно связанного.2. @jonrsharpe Это в JsFiddle, хотя это не имеет отношения к вопросу. Вопрос в том, почему жирные стрелки выполняют и помещают обещания в массив вместо самих себя в качестве функций
3. ваша ошибка не в скрипте, пожалуйста, добавьте ее, также у вас есть ненужные асинхронные настройки…
4. Я не думаю, что они это делают; Я могу работать,
[async () => await ticket.origMsg.author.send(msg), async () => await sleep(60 * 1000)]
несмотряticket
на то, что они не определены, как ожидалось, поэтому мне интересно, чтоinterruptRunner
делает, что заставляет вас думать, что они выполняются до его вызова. И @EugenSunic прав — на самом делеawait
также бессмысленно, объявлена ли функция arrow какasync
.