Проблема с Lodash Throttle или Debounce в цикле - PullRequest
0 голосов
/ 22 апреля 2019

Я вызываю запрос на выборку, который пытаюсь ограничить, используя Lodash Throttle или Debounce.Я перебираю какой-то массив и мгновенно вызываю функцию, которая заставляет сервер отвечать 502. Я пытаюсь замедлить запросы с помощью Throttle.Код ниже должен объяснить мою структуру.Этот пример не работает, и я не знаю почему?


    function doSomething(i) {
      console.log('Doing something: ' + i)
    }


    for (var i = 0; i < 50; i++) {

       _.throttle( function() { doSomething(i) }, 15000);

    }

Функция doSomething () должна вызываться каждые 15 секунд, а дополнительные запросы к этой функции должны составляться.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

_.throttle() не предназначен для использования таким образом.Правильный путь - сначала сохранить результат.

var throttledDoStomething = _.throttle(doSomething, 15000)

for (var i=0; i < 50; i++) {
  throttledDoSomething(i)
}
0 голосов
/ 22 апреля 2019

В ответ на комментарий:

В этом случае газ может быть не правильным выбором. Возможно, вы захотите использовать асинхронную функцию с помощью Promise.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

function asyncDoSomething(i) {
  return new Promise((resolve, reject) => {
    console.log('Doing something: ' + i);
    setTimeout(()=>{
      resolve(i);
    }, 15000)
  })
}

async function doSomethingLoop() {
  for (var i = 0; i < 50; i++) {
    await asyncDoSomething(i);
  }
}

doSomethingLoop();

Документ предполагает, что вы должны сначала выполнить функцию регулирования.
Для ввода аргумента необходима анонимная функция (в моем случае я использовал функцию Array).

function doSomething(i) {
  console.log("Doing something: " + i);
}

const throttledSomething = _.throttle(() => { doSomething(i)}, 5000);

for (var i = 0; i < 50; i++) {
  throttledSomething(i);
}
...