我是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,如下