2015-10-19 48 views
4

我怎樣才能返回數據使用承諾
有錯誤,successdata不是我的控制器中的函數,我不知道我在做什麼錯誤。我想念我的控制器中的東西嗎? 我通過調試應用程序響應OBSERV服務即將到來,但沒有將返回從中

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!' 
        }); 
       }); 

回答

2

我重構了一下你的代碼。真誠的我不明白你爲什麼要創建successdataerrordata功能。你可以嘗試一些更簡單的是這樣的:

服務:

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!' 
    }); 
}); 

UPDATE:

service代碼應與服務器上的一個小補丁來改善方返回correct http status code。有了這個改變,而不是返回data.success = false當有一些驗證錯誤時,你應該返回Status 400 Bad Requestdata.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'} 
      }); 
     } 
    } 
}); 

Angular $http doc

一個響應狀態代碼在200到299之間被認爲是成功的 狀態,並且將導致被調用的成功回調。請注意, 如果響應是重定向,則XMLHttpRequest將會透明地 跟隨它,這意味着將不會針對此類 響應調用錯誤回調。

+0

工作就像一個魅力thnks @manzapanza – Raj

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 
}); 
0

$http本身正在返回一個承諾,所以沒有必要在那裏創建一個新的可延遲。

整個事情可以簡化爲:

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."); 
      }); 
     } 
    } 
});