AngularJS$http结果与承诺



我是angular$q服务的新手。我将$http与angular$q服务一起用于实现异步请求。下面是我的代码,我无法获得后端api的结果。(json)

Services.js

.service('httpService', function($q, $http, $timeout) {
 var asyncRequest = function(url) {
    return $http.get(url)
        .then(function(response) {
            //res is the index of an array in php, which will be encoded.
            return response.res;
        }, function(response) {
            // something went wrong
            return $q.reject(response.res);
        });
 };
 return {
   asyncRequest : asyncRequest 
 };
});

Controller.js:

var result = httpService.test(url)
.then(function(data) {
    // Line below gives me "undefined"
    console.log(data);
}, function(error) {
    alert("Error...!");
});

上面提到的那一行,让我无法定义。(当然,我可以在主函数中编写console.log(数据),但这不是一个好的做法,因为我想将结果返回给控制器

关于我的$q服务的实现,有什么更简单的方法吗?

任何想法都将不胜感激。

在这种情况下,您应该不要使用$q,因为$http已经返回了一个promise。在低效中使用to 2。(如果使用的是非角度异步函数,例如Geo查找,则$q很有用)。

Services.js:

.service('httpService', function($http, $timeout) {
  var asyncRequest = function(url) {
    return $http.get(url)
  };
  return {
   asyncRequest : asyncRequest 
  };
});

Controller.js:

var result = httpService.asyncRequest(url)
.then(function(res) {
    console.log(res.data);
}, function(error) {
    alert("Error...!");
});

首先,您使用的是工厂样式,而不是服务。服务只是在this引用中定义方法的一个函数。

我认为您不需要在服务中使用.then,只需返回$http 返回的承诺即可

app.service('httpService', function($q, $http, $timeout) {
  this.asyncRequest = function(url) {
    return $http.get(url);
  };
});

和在控制器

 var result = httpService.test(url)
  .then(function(res) {
    // Line below gives me "undefined"
    console.log(res.data);
  }, function(error) {
    alert("Error...!");
  });

我认为您在服务上使用的是at factory的语法。

.service('httpService', function($q, $http, $timeout) {
   this.asyncRequest = function(url) {};
});

.factory('httpService', function($q, $http, $timeout) {
   return {asyncRequest: function(url) {}};
});

响应已在上述行中被拒绝。你不需要拒绝任何其他东西。所以你不需要$q

首先你已经答应了。您可以在控制器中通过添加$http承诺的success()error()委托来处理它。其次,这是异步操作。并且您不能像jQuery.ajax()那样从成功回调返回响应。这不是同步调用,这是异步调用,必须使用回调。你的错误就在这里。只需返回promise,并在响应被解决或拒绝时在控制器中进行处理。

所以你的控制器代码可以是这样的:

httpService.asyncRequest({
    ...
}).success(function(successfulResponse) {
    ...
}).error(function(failedResponse) {
    ...
});
.service('httpService', function($q, $http, $timeout) {
 var asyncRequest = function(url) {
   var defer = $q.defer();
    return $http.get(url)
        .then(function(response) {
            //res is the index of an array in php, which will be encoded.
            defer.resolve(response);
        }, function(response) {
            // something went wrong
            defer.reject(response.res);
        });
     return defer.promise;
 };
 return {
   asyncRequest : asyncRequest 
 };
});

您应该从您的对象返回promise,如下

相关内容

  • 没有找到相关文章

最新更新