【问题标题】:Cancel Request in AngularJS在 AngularJS 中取消请求
【发布时间】:2021-04-23 16:19:45
【问题描述】:

我浏览了一些链接:

How to cancel an $http request in AngularJS?

Cancelling ongoing Angular $http requests when there's a new request

How to cancel a $http call from controller in Angular JS?

http://embed.plnkr.co/gkvxRj/

但在我的代码中不起作用

如何取消之前的请求?下面在我的请求服务代码中。

function PostData (url, data,cancelPrevious, auth, token, headers) {
            var deferred = $q.defer();
            token = token || window.apiToken;
            headers = headers || {};
            if (cancelPrevious && $http.pendingRequests.length > 0) {
                deferred.resolve('cancel');
                var deferred = $q.defer();
                var newPostData = data ? JSON.stringify(JSON.parse(data)) : null;
                $http({
                    method: "POST",
                    url: url,
                    headers: headers,
                    data: newPostData
                }).then(function (response) {
                    deferred.resolve(response.data);
                }),
                    function (data) {
                        deferred.resolve(data);
                    };

                return deferred.promise;
            } else {
                var newPostData = data ? JSON.stringify(JSON.parse(data)) : null;
                $http({
                    method: "POST",
                    url: url,
                    headers: headers,
                    data: newPostData
                }).then(function (response) {
                    deferred.resolve(response.data);
                }),
                    function (data) {
                        deferred.resolve(data);
                    };

                return deferred.promise;
            }
            
        };

Using - 
Service.PostData(config.apiBaseUrl + "Monitoring/GetAllSpotLines", JSON.stringify(postData), true)

如果 $http.pendingRequests 数组中有任何请求未决,我将使用“cancelPrevious”标志取消请求。

我已经清楚地检查过它正在进入该条件,但 deferred.resolve('cancel') 不起作用

【问题讨论】:

  • 哪个部分不工作?您链接的所有示例都有效...确保将取消器/延迟作为超时对象传递给http调用timeout: deferred.promise。我觉得这是一个更好的解释示例:odetocode.com/blogs/scott/archive/2014/04/24/…
  • deferred.resolve('cancel') 这部分对我不起作用。我知道所有示例都在起作用,但不明白我在这里错过了什么
  • 谢谢..我尝试了 timeout: deferred.promise 并解决了我的问题..

标签: javascript angularjs promise xmlhttprequest angular-promise


【解决方案1】:

您可以将较早的 Promise 对象存储在另一个变量中,当您发现待处理的请求大于 0 时,您可以解决待处理的 Promise。查看更新的代码:

var pendingDeferred;
function PostData (url, data,cancelPrevious, auth, token, headers) {
            var deferred = $q.defer();
            token = token || window.apiToken;
            headers = headers || {};
            if (cancelPrevious && $http.pendingRequests.length > 0 && pendingDeferred) {
                
                pendingDeferred.resolve('cancel');                
                pendingDeferred = deferred;
                var newPostData = data ? JSON.stringify(JSON.parse(data)) : null;
                $http({
                    method: "POST",
                    url: url,
                    headers: headers,
                    data: newPostData
                }).then(function (response) {
                    deferred.resolve(response.data);
                }),
                    function (data) {
                        deferred.resolve(data);
                    };

                return deferred.promise;
            } else {
                pendingDeferred = deferred;
                var newPostData = data ? JSON.stringify(JSON.parse(data)) : null;
                $http({
                    method: "POST",
                    url: url,
                    headers: headers,
                    data: newPostData
                }).then(function (response) {
                    deferred.resolve(response.data);
                }),
                    function (data) {
                        deferred.resolve(data);
                    };

                return deferred.promise;
            }
            
        };

我已将较早的承诺存储在“pendingDeferred”变量中,下次如果找到待处理的请求,则解决待处理的承诺。

【讨论】:

  • 我尝试了上面的代码..但仍然得到相同的结果..进入 if 条件但没有解决 pendingDeferred.resolve('cancel')
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多