AngularJS 根据新请求中止之前的请求
AngularJS abort previous requests on new request
我编写了以下代码来填充自动完成,当用户输入新字符时,必须中止之前对先前短语的请求,但它不起作用。
这是我的控制器代码:
$rootScope.autocompletePendingRequests = [];
$rootScope.autoComplete = function (param) {
cancelAllPendingRequests();
var canceller = $q.defer();
$rootScope.autocompletePendingRequests.push({
canceller: canceller,
param: param
});
var promise = ngHomeService.searchAutoComplete(param, canceller.promise);
promise.then(function (response) {
if (response) {
var result = response.data;
return result;
} else
return null;
});
promise.finally(function () {
$rootScope.autocompletePendingRequests = $.grep($rootScope.autocompletePendingRequests, (value) => {
return value.param != param;
})
}
);
return promise;
};
function cancelAllPendingRequests() {
angular.forEach($rootScope.autocompletePendingRequests, (p) =>
p.canceller.resolve();
});
$rootScope.autocompletePendingRequests.length = 0;
}
这是我的服务:
this.searchAutoComplete = function (param, inputtimeout) {
return $http.get("api/Search/AutoComplete/",
{
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
}
},
{ timeout: inputtimeout });
};
我读过这个
和@ivarni 解决方案,但我还没有解决问题。
你能告诉我我的代码有什么问题吗?
最终,我找到了答案。问题出在这段代码上:
this.searchAutoComplete = function (param, inputtimeout) {
return $http.get("api/Search/AutoComplete/",
{
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
}
},
{ timeout: inputtimeout });
};
我改成了这样:
this.searchAutoComplete = function (param, inputtimeout) {
return $http({
method: "GET",
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
},
url: "api/Search/AutoComplete/",
timeout: inputtimeout
});
};
其实我把$http.get
改成了$http
,我不知道这两者到底有什么区别,但它解决了我的问题
我编写了以下代码来填充自动完成,当用户输入新字符时,必须中止之前对先前短语的请求,但它不起作用。 这是我的控制器代码:
$rootScope.autocompletePendingRequests = [];
$rootScope.autoComplete = function (param) {
cancelAllPendingRequests();
var canceller = $q.defer();
$rootScope.autocompletePendingRequests.push({
canceller: canceller,
param: param
});
var promise = ngHomeService.searchAutoComplete(param, canceller.promise);
promise.then(function (response) {
if (response) {
var result = response.data;
return result;
} else
return null;
});
promise.finally(function () {
$rootScope.autocompletePendingRequests = $.grep($rootScope.autocompletePendingRequests, (value) => {
return value.param != param;
})
}
);
return promise;
};
function cancelAllPendingRequests() {
angular.forEach($rootScope.autocompletePendingRequests, (p) =>
p.canceller.resolve();
});
$rootScope.autocompletePendingRequests.length = 0;
}
这是我的服务:
this.searchAutoComplete = function (param, inputtimeout) {
return $http.get("api/Search/AutoComplete/",
{
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
}
},
{ timeout: inputtimeout });
};
我读过这个 和@ivarni 解决方案,但我还没有解决问题。 你能告诉我我的代码有什么问题吗?
最终,我找到了答案。问题出在这段代码上:
this.searchAutoComplete = function (param, inputtimeout) {
return $http.get("api/Search/AutoComplete/",
{
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
}
},
{ timeout: inputtimeout });
};
我改成了这样:
this.searchAutoComplete = function (param, inputtimeout) {
return $http({
method: "GET",
params: {
searchText: param.text,
type: param.type,
searchType: param.searchType,
pageNumber: param.pageNumber,
pageSize: param.pageSize,
sort: param.sort
},
url: "api/Search/AutoComplete/",
timeout: inputtimeout
});
};
其实我把$http.get
改成了$http
,我不知道这两者到底有什么区别,但它解决了我的问题