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

Но проблема здесь в том, что когда пользователь нажимает кнопку обновления, будет создан другой экземпляр showDetails и два экземпляра будут выполняться в фоновом режиме. (Если пользователь нажимает 5 раз, будет создано 5 экземпляров функции showDetails()).

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

//creating variable
var variShow = null;

//calling showdetails() when user opens the site and assigning it to variable variShow
variShow = showdetails();

//when user presses update button checking whther variShow is null or not. if not null assign it to null and call showdetails() again.
if (variShow !== null) {
    variShow = null;
}
variShow = showdetails();

Но это все еще не работает, как я могу решить это?

2
pa1.Shetty 15 Апр 2019 в 08:18

2 ответа

Лучший ответ

Это решение: вы можете сделать это с флагом, но лучше использовать переопределение в конце!

var showDetails = function() {

   console.log("Active method!")
  // function 
  // your code here 

  // Override self
  showDetails = function(){console.log("not active any more")}  
}


// Just for test 
showDetails();

// Just for test again
showDetails();

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

   showDetails = function(){}

Тогда вы избежите ошибки при другом вызове showDetails ();

Если поставить:

   showDetails = null;

Тогда это приведет к ошибке 'showDetails ()'. Вы можете сделать его нулевым или

   showDetails = undefined;

Но тогда вы должны проверить перед любым звонком:

 // This is strong check work on all old and new browsers
  if (typeof showDetails !== 'undefined' && typeof showDetails === "function") {
    showDetails()
  }
var showDetails = function() {

   console.log("Active method!")
  // function 
  // your code here 
  showDetails = undefined;
  
  // modern js
  // delete showDetails
  
}

// First time call
showDetails();


// This is strong check work on all old and new browsers
if (typeof showDetails !== 'undefined' &&
    typeof showDetails === "function") {
    // Second call must be protected/checked
    showDetails()
    
} else {
   console.log("Not active method!");
}
2
Nikola Lukic 22 Апр 2019 в 17:11
var interrupted = false;

function showDetails(){

    interrupted = false;

    //Some task
    //...

    //Check if someone interrupt the function at some point of the function
    if(interrupted){
        //Some code to handle interruption here
        //...
        interrupted = false;
        return;
    }

    //Some task
    //...

    interrupted = false

}

Когда пользователь заходит на страницу

showDetails();

Когда пользователь нажимает кнопку

interrupted = true;
var waitInterval = setInterval(function(){
    //Wait until the running function to be terminated.
    if(!interrupted){
        clearInterval(waitInterval);
        showDetails();
    }
}, 100)
0
Solomon Tam 15 Апр 2019 в 06:32