为简单起见,我们假设我正在构建一个使用第三方API数据的货币转换器应用程序。我不是使用API返回原始数据,而是将其格式化,然后将其存储在工厂中,最后存储在本地存储中。
我正在使用resolve函数来获取数据:
.state('app.convertor', {
url: '/convertor',
views: {
'menuContent': {
templateUrl: 'templates/convertor.html',
resolve: {
xe: ['RatesService', function (Rates) {
return Rates.get()
}]
},
controller: 'ConvertorCtrl'
}
}
})
我的服务类似于以下代码。我知道这不起作用,但它描述了我喜欢的内容,即无论是从API获取还是仅从我的服务中获取相同类型数据的服务:
.factory('RatesService',
['$http', 'localStorageService',
function ($http, localStorage) {
var xe = {}
var lastUpdate
function isOutdated (date) {
return Date.now() < date + 1000 * 60 * 60
}
return {
get: function() {
// Check if I already have some data and if it's still up to date
if (lastUpdate && !isOutdated(lastUpdate) && xe.length) {
return xe
}
// Check if I have previously saved some data in my local storage
var _xe = localStorage.get('xe')
if (_xe && !isOutdated(_xe.lastUpdate)) return _xe.xe
// If don't have any data,
$http.get('/some/third/party/api').then(function (data) {
data = data.data
// ********************************
// Some work here on my data
// ********************************
// Save my data in the factory / local storage for future use
xe = data
lastUpdate = Date.now()
localStorage.set('xe', { xe: xe, lastUpdate: lastUpdate })
return xe
})
}
}
}
])
显然,由于我的异步通话,如果我没有任何数据,我的控制器中xe
为undefined
。有没有办法,我可以将所有这些逻辑封装在我的服务中,以便在控制器端获得完全相同的数据,无论我之前是否已经获取数据,仍然使用解析函数?
非常感谢你的帮助
答案 0 :(得分:0)
您需要返回$http.get
以使代码正常工作,因为返回$http.get
将返回来自服务的get
函数的承诺,并且当它得到解决时,它将返回数据使用内部返回语句。
return $http.get('/some/third/party/api')