2015-02-19 3 views
3

У меня есть функция, которая выполняется щелчком (или нажатием), потому что я работаю с Кордовой.Javascript - функция предотвращения многократного выполнения

Проблема заключается в том, что функция вызывает следующий объект из Parse.com, который показывает свои данные, но по какой-то причине он выполняет эту функцию дважды или даже 3 раза, пропуская 1 или 2 объекта, которые должны быть показаны.

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

Поэтому я не могу инициализировать флаг ложью внутри метода, потому что тогда он всегда будет выполняться. Глобальная переменная будет установлена ​​в true в первый раз и останется верной для остальной части ее «жизни».

Я попробовал второй метод, используя счетчик и убедившись, что если счетчик достигнет, допустим, 0, он может быть выполнен, но тогда у меня такая же проблема, если он вернется к 0, когда он достигнет конца. Предположим, что функция была выполнена дважды, я мог проверить, достигает ли счетчик 2 (каждый раз увеличивая его) и устанавливая его обратно на 0. Затем, когда в следующий раз, когда он будет выполнен, он будет выполняться 3 раза, поэтому, когда произойдет проверка если счетчик достигает 2 .., он возвращается к 0, и следующее выполнение (третий) будет выполнено снова, потому что счетчик снова 0.

Как уловить это или предотвратить это?

Я сделал основной Javascript, чтобы показать вам, что я имею в виду:

window.addEventListener("load",setup,false); 
var counter = 0; 
function setup() { 
    for(var i = 0; i < 3; i++) { 
     showAlert(); 
    } 
} 

function showAlert() { 
    if(counter == 0) { 
     alert("Executed once"); 
     counter++; 
    } else if(counter > 2) //counter is bigger than 2, so it got executed more than once { 
     counter = 0; //reset the counter to 0 
    }   
} 

Цель состоит в том, чтобы предотвратить функцию от выполнения более чем один раз (в этом случае сигнал тревоги не может быть показано более одного раза) , Это может быть выполнено два или даже три раза или даже больше. Как я могу это предотвратить?

Спасибо! Я немного знаю о программировании, но это то, чего я до сих пор не встречал, поэтому я не знаю, как я могу это поймать и убедиться, что он выполнен один раз?

+0

Вы ищете функцию, которую можно вызывать только каждые X секунд (например, помощник lodash's [_.debounce] (https://lodash.com/docs#debounce)) или функцию, которую можно вызвать только после он завершил операцию? –

+0

Я ищу функцию, которую нужно вызывать один раз, когда пользователь нажимает на нее, но по какой-то причине Кордова выполняет ее один, два или три раза. Поэтому я ищу способ предотвратить это. – Jorrex

ответ

6

Вы испытываете «отскок», проблему, вызванную одним ударом, регистрирующимся несколько раз подряд. Чтобы обойти это, вам нужно наложить очень короткий тайм-аут на вашу функцию. (20мс или так) Вы можете либо использовать сторонние библиотеки, такие как LoDash, которая имеет множество полезных функций полезности, такие как _.debounce, который выполняет это, или вы можете сделать это самостоятельно, как это:

var lastClick = 0; 
 
var delay = 20; 
 

 
function doClick() { 
 
    if (lastClick >= (Date.now() - delay)) 
 
    return; 
 
    lastClick = Date.now(); 
 

 
    // do things 
 
    alert("Hello!"); 
 
}
<button onclick="doClick()">Push me</button>

+0

Итак, если я понял это правильно, я тоже могу использовать функцию «setTimeout»? с момента его выполнения он выполняется как секунда, а затем выполняется? Или это что-то совсем другое? – Jorrex

+0

Я только что протестировал этот код, и он не работает :(он продолжает пропускать определенные объекты (поэтому он продолжает выполнение более одного раза) – Jorrex

+0

@Jorrex Вы можете попробовать увеличить период ожидания до 100 мс.Кроме того, вы можете отключить кнопку, как только она будет нажата, и только повторно включить ее, как только она завершит выборку данных. Таким образом, он не может пропустить предметы. –

Смежные вопросы