【问题标题】:How to make http request in my case在我的情况下如何发出http请求
【发布时间】:2015-04-10 06:37:53
【问题描述】:

我试图防止在我的代码中触发多个 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;

如果进程正在进行,上面的代码将防止请求被多次触发。但是,如果我在承诺解决之前再次单击该按钮,我会得到Cannot read property of .then of 'undefined'。我知道这是因为 $http 请求没有返回任何内容,因为我有 $http.pendingRequests.length===0 条件。上面的代码给了我我需要的东西,但我不知道如何防止控制台日志中的错误。谁能帮我吗?非常感谢!

【问题讨论】:

  • 所以你想检查 $http.pendingRequests!==undefined?
  • @ABOS 是的。我需要知道进程中的 http 请求何时进入。

标签: javascript angularjs xmlhttprequest


【解决方案1】:

以下将返回当前请求的promise,如果它存在,否则它将创建一个新的请求并返回该promise。它会在成功时清理当前请求。

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请求,这是我假设你需要的。它只会为相同的持续请求提供承诺。如果你需要它做其他事情,你能澄清一下这个问题吗?
  • 我的错,因为它不会触发新请求,factory.makeRequest.then(function(data) 会给我一个错误,即无法读取未定义的属性 'then'。跨度>
  • 我提供的代码应该总是返回一个 promise 对象。如果为空,则创建一个新的,否则为正在进行的请求提供一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2012-11-08
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多