Выход из функции обратного вызова, которая вызывается в цикле - PullRequest
0 голосов
/ 10 мая 2018

Ради интереса, я написал эту маленькую вспомогательную функцию, чтобы сделать цикл немного более читабельным. Он в основном оборачивает цикл while и принимает в качестве аргумента обратный вызов. Теперь я задаюсь вопросом, как выйти из цикла while из функции обратного вызова. Простой возврат из-за обратного вызова не будет работать, и я не могу вызвать прерывание из-за обратного вызова.

const loopFor = (time) => {
  return {
    milliseconds: (callback) => {
      const start = Date.now()
      while (Date.now() - start < time) {
        callback()
      }
    }
  }
}

loopFor(100).milliseconds(() => {
  console.log("Weeeeeeee, I'm looping")
})
console.log("Done looping")

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете вернуться с обратного вызова

const loopFor = (time) => {
  return {
    milliseconds: (callback) => {
      const start = Date.now()
      while (Date.now() - start < time && callback());
    }
  }
}

let counter = 5;
loopFor(100).milliseconds(() => {
  console.log("Weeeeeeee, I'm looping")
  if(--counter==0)return false
  return true
})
console.log("Done looping")

или, может быть, вы можете бросить исключение

class LoopEnd{}
const loopFor = (time) => {
  return {
    milliseconds: (callback) => {
      const start = Date.now()
      try{while (Date.now() - start < time)callback();}
      catch(e){if(!(e instanceof LoopEnd))throw e;}
    }
  }
}

let counter = 5;
loopFor(100).milliseconds(() => {
  console.log("Weeeeeeee, I'm looping")
  if(--counter==0)throw new LoopEnd()
})
console.log("Done looping")
0 голосов
/ 10 мая 2018

Я не думаю, что это рекомендуемый подход, но если вы должны продолжить этот подход, вам придется разработать обратный вызов, предоставив некоторое возвращаемое значение, чтобы разорвать цикл while.

* 1003 например *

const loopFor = (time) => {
  return {
    milliseconds: (callback) => {
      const start = Date.now()
      while (Date.now() - start < time) {
        if (!callback()){ //Break if callback returns false
          break;
        }
      }
    }
  }
}

loopFor(100).milliseconds(() => {
  console.log("Weeeeeeee, I'm looping")
  let condition = 1 > 5 //Some abritrary condition
  return condition
})
console.log("Done looping")
...