我正在使用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.stringfy(data.data)的启动消息;在成功块中,所以数据是混合的,但它没有延迟执行。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}]}
我该如何解决这个错误?
普通$q promise没有.success()
或.error()
方法,但无论如何都不应该使用延迟的反模式。相反,这样做:
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");
});
干净一点,是吗?