【问题标题】:success and error function in the controller for a service服务控制器中的成功和错误函数
【发布时间】:2015-09-07 18:40:18
【问题描述】:

我在服务中有以下代码,我正在从控制器调用 fetchData 函数。

服务

app.service("geturl", function($http) {
    urllist = [];
    geturl.fetchData = function() {
        var data = [];
        for (i = 0; i < urllist.length; i++) {
          (function(index) {
            return $http.get(geturl.urllist[index], {
              timeout: 8000
            })
            .then(function(response) {
              data[index] = response.data;
            });
          }(i);
          return data;
        });
    };
});

$http.get的成功和错误函数我想写在控制器中,因为UI中需要它,我该怎么做呢?

【问题讨论】:

标签: javascript angularjs angularjs-service angularjs-http angular-promise


【解决方案1】:

..我想把$http.get的成功和错误函数写在 控制器..

通常,.then() 函数有两个函数参数。第一个参数是成功处理程序,第二个参数是错误处理程序。

$http.get(url,options).then(function (response){
    //success handler function
    },function(error){
  //error handler function     
  })

或者,您可以分别指定.success.error 函数。

$http.get(url,options).success(function (response){
    //success handler function
    }).error(function(error){
  //error handler function     
  })

更新: 从您的代码来看,您似乎打算从您的服务geturl 返回一些东西并在那里提供回调。这不是应该如何做的。你应该从你的服务中返回一个承诺。

   ... 
   app.service("geturl",function($http){
     ...
     getData:function(){
        return $http.get(url,options);
     }
     ...               
   });
   ...

并在您使用服务的模块中处理成功/错误回调

geturl.getData().success(function(){
//handle success
}).error(function(){
//handle error
})

如果您需要发出多个 http 请求,永远不要使用 for 循环。请记住,一切都是异步的,并且您不能保证在创建新请求之前从前一个请求中获得响应。在这种情况下,您应该使用$q service。有关更多详细信息,请参阅@pankajparkar 的答案

【讨论】:

  • 另外,如果你将$http.get()的promise返回给控制器,那么你可以使用then(function() {})。如果您想在将数据发送到控制器之前对其进行操作,那么您可以返回then(function () {}),因为它返回了一个承诺。
  • @CallumLinington OP 想要一些不同的东西..他想要所有 ajax 完成后的数据..看看我的答案..
  • @CallumLinington:没错。我已经更新了答案。似乎 OP 在试图实现完全不同的目标时问了其他问题。谢天谢地 pankajparker 回答得很好
  • @CallumLinington:当我使用 done(function(){}) 时,我承诺会出错。我该如何解决?
  • 使用,then(function () {}, function () {}),第一个参数是成功函数,第二个是错误函数。
【解决方案2】:

好像你想在所有 ajax 完成后返回一个数据,你可以通过使用 $q.all() 来实现这一点

服务

app.service("geturl", function($http, $q) {
    this.urllist = [];
    this.fetchData = function() {
        var data = [], promises = [];
        for (i = 0; i < urllist.length; i++) {
          (function(index) {
            var promise = $http.get(geturl.urllist[index], {
              timeout: 8000
            })
            .then(function(response) {
              data[index] = response.data;
            });
            promises.push(promise); //creating promise array
          }(i);
        };
        return $q.all(promises).then(function(resp){ 
            return data; //returning data after all promises completed
        });
    };
});

【讨论】:

  • 我不确定天气是否可以回答 OP 的原始查询或更正给定的代码。谢谢你的回答为我节省了几分钟的打字时间。荣誉
  • @NLN 谢谢老兄.. 我认为您的回答仅涵盖I want to write the success and error function of $http.get in the controller.. 这部分,这就是我写答案的原因:p
  • $q.all() 即使有一个请求失败,也会失败。即使个别请求失败,有什么方法可以执行 then 函数吗?
  • 是的,我试过 $q.all(promises).then(function(data){// some logic});即使其中一个ajax调用失败,它也不会进入then函数。
  • @user2851669 对不起我的坏事.. 你需要装饰 $q 服务以便允许下一个承诺承诺即使前一个承诺失败。看看这个codeducky.org/q-allsettled
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多