【发布时间】:2015-09-16 03:50:07
【问题描述】:
为简单起见,假设我正在构建一个货币转换器应用程序,该应用程序使用来自第三方 API 的数据。我不想使用 API 返回的原始数据,而是对其进行格式化,然后将其存储在工厂中,最终存储在本地存储中。
我正在使用解析函数来获取数据:
.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。有没有办法,我可以将所有这些逻辑封装在我的服务中,以便在控制器端获取完全相同的数据,无论我之前是否获取数据并且仍然使用解析功能?
非常感谢您的帮助
【问题讨论】:
-
你应该
return你正在创建的承诺。
标签: angularjs angular-ui-router promise