Альтернатива зацикливанию внутри для ... of и while (true) - PullRequest
0 голосов
/ 27 августа 2018

Очень часто я заканчиваю тем, что пишу циклы с await внутри, чтобы последовательно выполнять некоторые задачи или достигать определенного интервала между итерациями.

Например:

for (const item of items) {
  await doSomthing(item);
}

или

while(true) {
  await doSomeTask();
  await delay(60000);  
}

Однако ESLint выговаривает мне за написание такого рода кода.

Что является альтернативой последовательному циклу с ожиданием и бесконечным циклом с ожиданием внутри, когда я не хочу запускать все асинхронные задачи одновременно и скорее хочу запускать их в медленном темпе?

Ответы [ 2 ]

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

Вы можете использовать рекурсивную функцию для достижения того же эффекта, и это позволит вам более полно использовать асинхронную природу того, что вы делаете. Ваш основной поток может продолжать и делать другие вещи, а не ждать окончания цикла for - любой код, который основывается на завершении этого раздела, может быть выполнен в функции обратного вызова, которую вы передаете.

function asynchronousFunction(thing){
  //do something
  console.log('doing something')
  return new Promise(resolve => {
    setTimeout(e => resolve(), 1000)
  })
}

async function doSomething(arrayOfThings, next){
  const thing = arrayOfThings.pop()
  const responseFromAsyncFunction = await asynchronousFunction(thing)
  console.log('after', arrayOfThings.length)
  if(arrayOfThings.length) doSomething(arrayOfThings, next)
  else next()
}

const myData = [1,2,3,4,5]

doSomething(myData.slice(0), function(){ console.log('done') })
0 голосов
/ 27 августа 2018

ESLint выговаривает мне за написание такого рода кода.

Решение здесь состоит в том, чтобы отключить ESLint - либо индивидуально для этих строк, либо это ужасное правило в целом. Даже сами документы по правилу говорят: « Во многих случаях […] имеет смысл использовать await в цикле, и рекомендуется отключить правило с помощью стандартного комментария отключения ESLint ».

Код, который вы пишете, идеально подходит для последовательного выполнения задач. Если вы хотите избежать этого, в качестве альтернативы есть только рекурсия, которую линтер не может обнаружить: -)

...