Javascript 在我的案例中如何发出http请求

Javascript 在我的案例中如何发出http请求,javascript,angularjs,xmlhttprequest,Javascript,Angularjs,Xmlhttprequest,我试图防止在我的代码中触发多个http请求 我有点像 在我的控制器中 //if use click, fire this method var getItems = function() { factory.makeRequest.then(function(data){ //do stuff with data... }) } 在我的工厂里 var factory = {}; factory.makeRequest = function(){ if($

我试图防止在我的代码中触发多个http请求

我有点像

在我的控制器中

//if use click, fire this method
var getItems = function() {
    factory.makeRequest.then(function(data){
        //do stuff with data...
    })
}
在我的工厂里

var factory = {};
factory.makeRequest = function(){
    if($http.pendingRequests.length===0) {
            return getData()
            .then(function(data) {
                //do stuff here
                return data;
            })     
        }
}

factory.getData = function() {
    return $http.get('/project/item');
}

return factory;

如果进程正在进行,上述代码将防止多次触发请求。但是,如果在承诺得到解决之前再次单击按钮,我将获得
无法读取的属性。然后是'undefined'
。我知道这是因为
$http
请求没有返回任何内容,因为我有
$http.pendingRequests.length==0
条件。上面的代码提供了我所需要的,但我不知道如何防止控制台日志中的错误。有人能帮我吗?非常感谢

以下命令将返回当前请求承诺(如果存在),否则将创建新请求并返回该承诺。它将在成功时清除当前请求

var factory = {};
factory._currentRequest = null;
factory.makeRequest = function(){
    if(!factory._currentRequest) {
        factory._currentRequest = factory.getData()
            .then(function(data) {
                //do stuff here
                factory._currentRequest = null;
                return data;

            })  
    }
    return factory._currentRequest
  }

factory.getData = function() {
    return $http.get('/project/item');
}

return factory;

所以你要检查$http.pendingRequests==未定义?@ABOS是的。我需要知道http请求何时进入进程。谢谢,但这不会阻止多次触发请求。这取决于您的意思,当当前http请求正在进行时,它不应该触发另一个http请求,这是我假设您需要的。它只会为同样的持续请求提供承诺。如果你需要它做其他事情,你能澄清这个问题吗?我的错,因为它不会发出新的请求,factory.makeRequest.then(函数(数据)将给我一个错误,即无法读取未定义的属性'then'。我提供的代码应始终返回一个承诺对象。如果为null,它将创建一个新的承诺对象,否则它将为正在进行的请求提供一个承诺对象。