我发送一个ajax请求来从服务器获取数据并将其存储在本地变量中。这是内部服务。然后在控制器中我使用promise来在需要时获取数据。它第一次起作用,因为没有检测到缓存并且返回了promise,但是下次我没有从服务函数返回任何promise,因此javascript错误。
我在服务中的功能是:
getProductDetails: function(product) {
if(!productDetailsArr[product.id]) {
if (!promiseProductDetails) {
// $http returns a promise, which has a then function, which also returns a promise
promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) {
productDetailsArr[product.id] = response;
return productDetailsArr[product.id];
});
}
// Return the promise to the controller
return promiseProductDetails;
} else {
return productDetailsArr[product.id];
}
}
在控制器中,我使用以下代码调用了上述函数:
ServiceData.getProductDetails($scope.product).then(function(data) {
$scope.productDetails = data;
});
所以第二次我得到JS错误:
TypeError: ServiceData.getProductDetails(...).then is not a function
任何想法如何解决这个问题。
答案 0 :(得分:5)
你应该做的是总是回报一个承诺。在这种情况下,您只需返回已解决的承诺。您可以阅读有关此here的更多信息。
if(!productDetailsArr[product.id]) {
if (!promiseProductDetails) {
// $http returns a promise, which has a then function, which also returns a promise
promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) {
productDetailsArr[product.id] = response;
return productDetailsArr[product.id];
});
}
// Return the promise to the controller
return promiseProductDetails;
} else {
var deferred = $q.defer();
deferred.resolve(productDetailsArr[product.id]);
return deferred.promise;
}