我正在使用angularjs和cordova工具来创建应用程序。
我创建了服务,其中包含用于调用API的代码。并且我希望将响应返回到我的角度控制器。
我的代码是, 服务,
JodoModule.factory('commonServices', function ($http, $q, $rootScope) {
return {
getServiceData: function (url) {
$rootScope.loading = true;
var deferred = $q.defer();
var req = {
method: 'GET',
url: url
}
$http(req).success(function (data) {
alert("data in service = " + JSON.stringify(data.Data));
deferred.resolve(data);
}).error(function (data, status, headers, config) {
deferred.reject(status);
});
return deferred.promise;
}
};
});
我的控制器是,
commonServices.getServiceData("My url").
success(function (data, status, headers, config) {
alert(data);
}).
error(function (data, status, headers, config) {
alert("Got error");
});
在上面的代码中,在服务中,它显示了JSON.stringify(data.Data)的elert消息;在成功块中,所以数据正在进行,但它没有执行deferred.resolve(data);正确...
Web工具栏中的 给我发错,
的 ie. TypeError: undefined is not a function
我的o / p是:
{"status":"SUCCESS","Message":"success","Token":"","Data":[{"Id":17,"UserId":"477f1919-6b80-4804-a325-ac0cb05bcd3e","UserName":"honey","FirstName":"honey","LastName":null,"ProfilePic":false,"Status":2}]}
如何解决此错误。 ?
答案 0 :(得分:2)
普通$ q承诺没有.success()
或.error()
方法,但您无论如何也不应该使用deferred antipattern。相反,这样做:
JodoModule.factory('commonServices', function ($http, $rootScope) {
return {
getServiceData: function (url) {
$rootScope.loading = true;
var req = {
method: 'GET',
url: url
};
return $http(req).then(function (result) {
alert("data in service = " + JSON.stringify(result.data.Data));
return result.data;
});
}
};
});
控制器:
commonServices.getServiceData("My url").
then(function (data) {
alert(data);
}).
catch(function (result) {
alert("Got error");
});
相当干净,是吗?