解决AngularJS中的设计模式

时间:2015-09-15 19:47:16

标签: angularjs angular-ui-router promise

为简单起见,我们假设我正在构建一个使用第三方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
        })
      }
    }
  }
])

显然,由于我的异步通话,如果我没有任何数据,我的控制器中xeundefined。有没有办法,我可以将所有这些逻辑封装在我的服务中,以便在控制器端获得完全相同的数据,无论我之前是否已经获取数据,仍然使用解析函数?

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

您需要返回$http.get以使代码正常工作,因为返回$http.get将返回来自服务的get函数的承诺,并且当它得到解决时,它将返回数据使用内部返回语句。

return $http.get('/some/third/party/api')