2016-05-25 56 views
0

使用承諾時遇到問題。 我的控制器是javascript中的句柄承諾

angular.module('shoppingPad').controller('customerCtrl', customerCtrl); 
function customerCtrl($scope, customerService){ 

    $scope.addCustomer=function() { 
     alert("inside add Customer function"); 
     var customer={ 
      name: $scope.name, 
      number: $scope.number 
     }; 
     customerService.addCustomer(customer).then(function(response){ 
      console.log(response); 
     }, 
     function(error){ 
      console.log(error) 
     }); 
} 

這是我的服務

angular.module('shoppingPad').service('customerService', customerService); 
function customerService($q, $http,restService) { 
    //this is deferred object which will resolve or resolve the promise 
    var deferred = $q.defer(); 
    //a function to add customer data to backend used service.it takes customer object as paramater. 
    this.addCustomer = function(customer) { 
    return restService.postRequest('customers/info',customer,function(response){ 
     deferred.resolve(response.data); 
     return deferred.promise; 
    }, 
    function(error){ 
     deferred.reject(error); 
     return deferred.promise; 
    }); 
}; 

這是我restService.js

angular.module('shoppingPad').service('restService',restService); 
function restService($http){ 
    //set port number and baseUrl here 
    var port=3001; 
    var baseUrl="http://localhost:"+port; 

//generic getRequest function 


this.postRequest=function(url,data,successCallback,failureCallback){ 
    $http({ 
     method:'POST', 
     url:baseUrl+"/"+url, 
     data:data 
    }).then(function(response){ 
     successCallback(response); 
    }, 
    function(error){ 
     alert("internal server error"); 
     failureCallback(error); 

    }); 

};//end of postRequest function 
}//end of service 

我收到錯誤在我的控制器 錯誤:customerService.addCustomer( ...)未定義。 如果IAM做錯了請用我的好代碼糾正我

回答

3

你的代碼中的問題是你沒有從你的$http()調用this.postRequest()方法中返回任何東西。

如下更改方法:

this.postRequest=function(url,data){ 
    return $http({ 
      method: 'POST', 
      url: baseUrl+"/"+url, 
      data: data 
      }); 

}; 

千萬不要錯過這個成功和錯誤回調,但只是從這個上游方法返回的承諾和處理的承諾。此外,由於每一次這個承諾的回報本身就是一個承諾,您不需要在customerService中使用$q來創建新的承諾。剛剛從postRequest方法返回相同的承諾如下:

this.addCustomer = function(customer) { 
    return restService.postRequest('customers/info', customer); 
} 

這樣,你不需要額外的不必要的承諾。

現在在你的控制器可以處理如下返回的承諾:

$scope.addCustomer=function() { 
    alert("inside add Customer function"); 
    var customer={ 
     name: $scope.name, 
     number: $scope.number 
    }; 

    customerService.addCustomer(customer) 
    .then(function(response){ 
    console.log(response); 
    }) 
    .catch(function(error){ 
    console.log(error) 
    }); 
} 

而且我已經使用.catch而不是傳遞錯誤回調作爲第二個參數.then,因爲它有的一個額外的好處在成功回調中的錯誤以及來自退回承諾的任何錯誤

+0

我不認爲他知道如何處理承諾。如果他知道他不會問這個。也許你還需要添加一個例子。 –

+0

@TJ完成。控制器中添加處理程序 –