如何使用承诺返回数据 得到错误,successdata不是我的控制器中的功能,我不知道我做错了什么。我想念控制器里的东西吗? 我通过调试应用程序响应监视正在服务但没有任何东西从它返回
var module = angular.module('app', []);
module.service("webservice", function($http,$q) {
return {
callservice:function(method,url,_data){
var deferred = $q.defer();
var promise = deferred.promise;
$http({
method: method,
url: App_Service_api+url,
data: _data,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).
success(function (data, status, headers, config) {
if (data.success) {
deferred.resolve(data.message);
//return deferred.promise;
promise.successdata = function(fn) {
promise.then(fn);
return deferred.promise;
}
}
else {
deferred.reject("Plase Enter valid data.");
//return deferred.promise;
promise.errordata = function(fn) {
alert("error");
promise.then(null, fn);
return deferred.promise;
}
}
}).
error(function(data, status, headers, config){
deferred.reject("Plase Enter valid data.");
//return deferred.promise;
promise.errordata = function(fn) {
promise.then(null, fn);
return deferred.promise;
}
});
}
}
})
这是我的控制器代码
webservice.callservice('POST',App_Service_login,inputs).successdata(function(data){
var alertPopup = $ionicPopup.alert({
title: 'Login Succesfull!',
template: 'Please check your credentials!'
});
})
.errordata(function(data) {
var alertPopup = $ionicPopup.alert({
title: 'Login failed!',
template: 'Please check your credentials!'
});
});
答案 0 :(得分:2)
我重构了一下你的代码。我真的不明白为什么要创建函数successdata
和errordata
。你可以试试这样简单的东西:
服务:
module.service("webservice", function($http, $q) {
return {
callservice: function(method, url, _data){
var deferred = $q.defer();
$http({
method: method,
url: App_Service_api + url,
data: _data,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).
success(function (data, status, headers, config) {
if (data.success) {
deferred.resolve(data.message);
}
else {
deferred.reject("Plase Enter valid data.");
}
}).
error(function(data, status, headers, config){
deferred.reject("Plase Enter valid data.");
});
return deferred.promise;
}
}
});
控制器:
webservice.callservice('POST', App_Service_login, inputs).then(function(dataMessage){
console.log('dataMessage', dataMessage);
var alertPopup = $ionicPopup.alert({
title: 'Login Succesfull!',
template: 'Please check your credentials!'
});
})
.catch(function(errorMessage) {
console.log('errorMessage', errorMessage);
var alertPopup = $ionicPopup.alert({
title: 'Login failed!',
template: 'Please check your credentials!'
});
});
更新:
这个service
代码应该通过返回correct http status code的服务器端进行一些修改来改进。使用此更改而不是在出现某些验证错误时返回属性data.success = false
,您应该返回Status 400 Bad Request
和data.message = 'Please Enter valid data'
。这样做,您应该从响应中删除属性data.success
,控制器将保持不变,并且您的服务将变为:
服务:
module.service("webservice", function($http, $q) {
return {
callservice: function(method, url, _data){
return $http({
method: method,
url: App_Service_api + url,
data: _data,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
}
}
});
200到299之间的响应状态代码被视为成功 status并将导致调用成功回调。注意 如果响应是重定向,XMLHttpRequest将透明 按照它,意味着不会为此调用错误回调 响应。
答案 1 :(得分:0)
也许我没有让你的代码正确,但我认为这很复杂。 只需:
success(function (data, status, headers, config) {
if (data.success) {
deferred.resolve(data.message);
}else{
deferred.reject(...)
}
和
webservice.callservice('POST',App_Service_login,inputs)
.then(function(data){
var alertPopup = $ionicPopup.alert({..})
}, function(err){
//errorhandling
});
答案 2 :(得分:0)
$http
本身正在返回一个承诺,所以没有必要在那里创建一个新的deferrable。
整个事情可以简化为:
var module = angular.module('app', []);
module.service("webservice", function($http,$q) {
return {
callservice:function(method,url,_data){
return $http({
method: method,
url: App_Service_api+url,
data: _data,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).
then(function (response) {
if (response.data.success) {
return data.message;
}
else {
$q.reject("Plase Enter valid data.");
}
}, function() {
$q.reject("Plase Enter valid data.");
});
}
}
});