javascript - JS onclick,覆盖之前的点击
问题描述
我正在编写一个查询引擎,用户输入参数然后单击查询。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>
解决方案
您的代码已进入多线程,第一个线程已分配给您单击功能中的代码,第二个线程已分配给http get request
. 所以第一个线程被执行,因为它忽略了下一个线程执行。为此,在 javascript 中,我们有用于处理异步调用的回调函数。而不是使用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.
}
}
推荐阅读
- javascript - 观察 HTMLElements 上的隐式大小变化
- javascript - 使用 .filter() 过滤 javascript 对象
- android - 在 Gradle 中添加 dataBinding 时,无法在 null 对象上调用方法 dataBinding()
- ios - 在“CLUSTERED”附近抛出 SQL 语法错误:语法错误
- javascript - Fetch API 在 Chrome 中泄漏内存
- user-interface - 为什么 Google、Bing、Yahoo 等搜索引擎不尝试使用左侧(徽标下方)的可用空间?
- qt - 使用 Qt3D 加载 .FBX 文件
- html - 您如何将 html 中的 div 元素编码为链接?
- python - “res_model”列中的空值违反 Odoo11 中的非空约束
- java - 无法访问位于 src/main/resources/ 下的文件