Неожиданное поведение асинхронной жирной стрелки внутри массива

#javascript #asynchronous #async-await

#javascript #асинхронный #async-ожидание

Вопрос:

РЕДАКТИРОВАТЬ: Больше не могу воспроизвести это поведение, но это происходило в node версии 14.7.0. Все возвращается в нормальное русло, я могу просто передать обычный обратный вызов () => <AsyncFunction>() , и это работает… Возможно, что-то пошло не так в среде отладки, которую я использую, и она не загрузила обновленный код, я не знаю.

Я думал, что наличие async () => <function>() синтаксиса создаст функцию, которая затем помещается в массив interruptRunner , вместо этого она немедленно выполняется и, следовательно, помещает обещание в массив.

Я не понимаю, почему это так, оно не должно выполняться. Заключение в квадратные скобки async () => (<function>()) возвращаемого типа решает проблему, но я не уверен, почему это было выполнено в первую очередь. Я думал, что немедленное выполнение возможно только с IFFE.

JS Fiddle

 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 .