【问题标题】:Resolve design patterns in AngularJS解决 AngularJS 中的设计模式
【发布时间】: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


【解决方案1】:

您需要返回$http.get 以使您的代码正常工作,因为返回$http.get 将从服务的get 函数返回一个promise,当它得到解决时,它将使用内部return 语句返回数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多