我在AngularJS 1.5上有一个页面。它有一个服务层来处理使用promise的数据加载。
控制器将调用服务以获取如下数据:
var loadClients = programSelectorService.loadClients();
var loadYears = programSelectorService.loadYears();
$q.all([loadClients, loadYears ]).then(
function(values) {
handleClients(values[0]);
handleYears(values[1]);
},
function(err) {
dataModel.loadingError = err;
dataModel.loadingClient = false;
dataModel.loadingYear = false;
}
);
在我向其添加缓存服务之前,它完美运行。缓存服务无需API调用即可直接获取实际数据。
所以我在loadClients()
:
var data = VCache.get(endPoint);
if(data) {
deferred.resolve(data); // line X
// return data; // line Y
return deferred;
}
但是X线和Y线都不起作用。对于第X行,调用者会发现values[0]
是一个承诺而不是实际数据。对于第Y行,来电者会发现values[0]
为null
。
我不想更改来电代码。所以我的问题是:如何将真实数据转换为AngularJS 1承诺?
贾斯汀
谢谢!
答案 0 :(得分:1)
在您的情况下,您预先拥有数据,因此假设您使用$q
服务,您只需返回已解决的承诺:
var data = VCache.get(endPoint);
return $q.resolve(data);
一般模式是这样的:
var deferred = $q.defer();
// Some async operation that completes later
setTimeout(function() {
var data = VCache.get(endPoint);
deferred.resolve(data);
}, 1000);
// Return the promise immediately
return deferred.promise;