【发布时间】:2017-06-28 11:58:21
【问题描述】:
我已经阅读了网络上的几个示例和 SO 上的问题,但我仍然缺少一些东西。
我有一项服务可以从我的 API 中获取订单数据。我想解决服务内部的承诺。服务内的 console.log 记录了正确的数据。
但是,在我的控制器中,我得到 "TypeError: Cannot read property 'then' of undefined"
我以为控制器函数会等待数据解析?
服务
angular.module('app')
.factory('orderService', function($http) {
// DECLARATIONS
var baseUrl = 'http://api.example.com/';
var method = 'GET';
var orderData = null;
return {
getOrderData: getOrderData
};
// IMPLEMENTATIONS
function getOrderData(ordernumber) {
// order data does not yet exist in service
if(!orderData) {
dataPromise = $http({
url: baseUrl + 'order/' + ordernumber,
method: method,
withCredentials: true,
headers: {
'Content-Type': 'application/json'
}
// success
}).then(function(response) {
orderData = response.data;
console.log('Received data: ' + JSON.stringify(response.data));
return orderData;
},
// faliure
function(error) {
console.log("The request failed: " + error);
});
// order data exist in service
} else {
console.log('Data present in service: ' + orderData);
return orderData;
}
} // end: getOrderData function
}); // end: customerService
控制器
app.controller('orderController', function($scope, $stateParams, orderService) {
$scope.ordernumber = $stateParams.order;
orderService.getOrderData($scope.ordernumber)
// success
.then(function(response) {
$scope.order = response;
console.log('Controller response: ' + response);
},
// faliure
function(error) {
console.log("The request failed: " + error);
});
});
【问题讨论】:
-
所以您正在尝试缓存请求的响应。但是您只缓存一个结果。如果
ordernumber发生变化,您仍会返回旧ordernumber的结果。结果的有效期是多久?您没有使代码中的缓存数据无效的概念。这里的整个缓存概念都被打破了;你应该重新考虑一下。在此之前,您可以将您的功能简化为function getOrderData(ordernumber) { return $http(...).then(response => response.data) }。这不会缓存,但会返回正确的结果 -
是的,甚至在我发布代码之前我就已经想到了。订单号会改变。感谢您的输入!我会去掉它,因为现在传输的数据量太少了,我实际上不需要它
标签: javascript angularjs angular-promise