Как сделать задержку для функции, но не выполнять снова в Javascript

Я хотел бы сделать все это сам.

Вы должны сравнивать значения Obj::field2, если значения Obj::field1 равны.

Легко понятный способ:

/* This will meet the requirements of Strict-Weak-Ordering */

if (a.field1 != b.field1) return a.field1 < b.field1;
else                      return a.field2 < b.field2;

Правильный (рекомендуемый) способ:

« правильный » способ его использования использует только operator<, чтобы сравнить поля, ниже выглядит более сложным, чем на самом деле.

Однако он даст тот же результат, что и ранее написанный простой для понимания пример.

return a.field1 < b.field1 || (
  !(b.field1 < a.field1) && a.field2 < b.field2
);

Должен быть способ реализации operator<, не вызывая много головной боли?

C ++ 11

Вы можете использовать std::tuple из STL , которые уже имеют operator< для нескольких определенных полей, например, в приведенном ниже примере.

#include 

...

inline bool
operator< (Obj const& lhs, Obj const& rhs)
{
  return std::tie (lhs.field1, lhs.field2) < std::tie (rhs.field1, rhs.field);
}

C ++ 03

Если ваш компилятор еще не поддерживает C ++ 11, и вам нужно сравнить только два поля из каждого объекта, который вы могли бы использовать std::pair.

Причина для std::make_pair - это то же самое как в предыдущем примере, используя std::tie.

#include 

...

inline bool
operator< (Obj const& lhs, Obj const& rhs)
{
  return std::make_pair (lhs.field1, lhs.field2)
       < std::make_pair (rhs.field1, rhs.field2);
}

с использованием std::pair потребует re-копии членов, которые будут созданы, что в некоторых случаях нежелательно.

Это действительно рекомендуемая практика?

См. ниже вопрос / ответы для получения дополнительной информации, но для его суммирования вверх; подход c ++ 11 не вызывает много накладных расходов, и его очень просто реализовать.

-1
задан Adam Smith 27 February 2019 в 04:27
поделиться

2 ответа

Если я не ошибаюсь, в этом случае вам нужна функция, которая называлась «debounce», например:

function debounce(func, wait) {
    let timeout;
    return () => { //create closure
      let context = this,
        args = arguments;

      let excuteFunction = () => {
        func.apply(context, args)
      }
      clearInterval(timeout);
      timeout = setTimeout(excuteFunction, wait);
    };
  }

, когда func - ваша функция съемки и [ 118] wait - время задержки.

Вы можете узнать больше о технике отказов в здесь

Или вы можете использовать встроенную функцию отказов в Lodash: Документы Lodash

0
ответ дан LocV's Nest 27 February 2019 в 04:27
поделиться

Если я понимаю вопрос, вам нужна система, которая предотвращает функцию, скажем, shootBullet(), до тех пор, пока не закончится задержка. Самый простой способ сделать это - глобальная переменная и setTimeout:

var canShoot = true;

function shootBullet() {
    if (canShoot) {
        //Shoot bullet
    }
    canShoot = false;
    setTimeout(function() {
        canShoot = true;
    }, 2000);
}
0
ответ дан Redwolf Programs 27 February 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: