2

我正在尝试创建一个自定义服务,该服务从服务器中提取所有已定义状态的列表以用于表单,到目前为止我有:

SimpleTaskApp.factory('storyStatus', function($http) {
    var data = null;
    var promise = $http({
            url: '/story-status/',
            method: 'GET'
        }).success(function (resp) {
            data = resp;
        });
    return {list: data }};
});

我知道这不起作用,因为 $http 是异步的,但是我不想多次运行请求。我想把它当作一个静态变量,所以如果调用了storyStatus.list,它应该检查它是否为空,然后尝试填充自己。

4

2 回答 2

2

你应该使用promise 而不是反对它们。

您不需要存储数据,因为您可以存储promise。承诺的意义在于你不知道它们何时会完成。您不知道您的数据何时可用。

所以你的服务必须回报承诺。但这没关系:

SimpleTaskApp.factory('storyStatus', function($http) {
  var promise;

  function getData() {
    if ( ! angular.isDefined( promise ) ) {
      promise = $http({
        url: '/story-status/',
        method: 'GET'
      });
    }

    return promise;
  }

  return { list: getData };
});

在此服务中,您的$http调用只会被调用一次,但无论何时调用都会返回一个承诺SimpleTaskApp.list()。调用它的控制器不需要知道数据是否存在,因为无论如何它都会做出相同的反应,例如:

SimpleTaskApp.controller('MainCtrl', function($scope, storyStatus) {
  storyStatus.list().then(function( data ) {
    $scope.statuses = data.statuses;
  });
});

如果数据已经取回,则then基本立即运行;如果没有,它将在数据返回时运行。控制器不需要知道任何关于storyStatus服务内部状态的信息。

因此,promise 不仅有助于异步任务,而且还有助于保持我们的组件解耦,这在 AngularJS 中很重要 - 也应该在其他框架中!

于 2013-04-09T07:38:18.123 回答
1

你可以这样做吗?

SimpleTaskApp.factory('storyStatus', function($http) {

    var promise = $http({
        url: '/story-status/',
        method: 'GET'
    });

    return { list: promise };
});

调用代码

storyStatus.list.then(function (data) {
});

synchronous如果您只加载一次列表,您可能需要考虑使用ajax 调用来简化您的 API。

于 2013-04-09T06:08:37.337 回答