JS onclick, переопределить предыдущий клик - PullRequest
0 голосов
/ 23 января 2020

Я пишу механизм запросов, в котором пользователь вводит параметры, а затем щелкает запрос. Событие ng-click может занять до 7-10 секунд, но рендеринг страницы 1 занимает менее секунды. Если пользователь хочет повторно отправить новый запрос до истечения этого времени, существует некоторая задержка, поскольку я считаю, что исходный вызов функции все еще возвращается.

Есть ли способ внезапно остановить любую предыдущую функцию звонки и только самые последние звонки?

Ниже приведена функция запроса и вызов из HTML

$scope.query = function(name, matchMode, domain) {
        name = name.trim();
        $scope.pageNumber = 0;
        start = 0
        end = $scope.perPage;
        $http.get(ROOT_API+"query/asset/"+name+"/"+matchMode+"/"+domain).success(
            function(data){
                $scope.results=data;
                $scope.displayResults=$scope.results.slice(start,end);
                $scope.totalResults=data.length;
                $scope.totalPages=Math.floor($scope.totalResults / $scope.perPage);
                setPageValues($scope.displayResults)
            });

        setTimeout(function() {
            $scope.displayResults.concat(setPageValues($scope.results.slice(end,$scope.totalResults)))
        },2000);

    }
<input ng-model="queryName" placeholder="name">
<input ng-model="matchMode" placeholder="match mode" defaultValue="ANYWHERE">
<input ng-model="domain" placeholder="domain" defaultValue="ANY">
<button ng-click="query(queryName, matchMode, domain)">QUERY</button>

Ответы [ 2 ]

1 голос
/ 23 января 2020

Ваш код прошел многопоточность, первый поток назначен коду внутри функции щелчка, с которой он был запущен, а второй назначен http get request. поэтому первый поток исполняется, поскольку он игнорирует выполнение следующего потока. Для этого в javascript у нас есть функции обратного вызова для обработки асинхронных вызовов c. вместо использования setTimeout function, запишите ответ на вызов API в обратном вызове.

    let apicallFun = function(requestObj, Callback){
       console.log("Inside API call");
       return $http.get('/your_URL', requestObj)
      .then(function(response){
         Callback(response);
      })
    }

, а затем внутри функции щелчка вызовите это apicallFun как:

$scope.clickFun = function(requestObj){
    apicallFun(requestObj, function(response){
       //according to your response object write the rest of your code.
    }
}
0 голосов
/ 23 января 2020

Может быть, вы могли бы обернуть все это в do ... while l oop и получить некоторую переменную выхода, которую вы можете установить в true?

...