1

我在 Angular 中有一项服务,可以从数据库表中获取查询列表。用户选择一个并移动到另一个视图以使用它。当用户点击回到第一个视图时,我想避免重新获取查询列表。查询列表存储在服务中,但鉴于我的 fetch 例程使用 .then 和 promise,我很难将其交还给控制器。

app.service('queryService', function ($http) 
{
  var querys        = new Object();

  this.loadQueryList = function() 
  {
    if (querys!=null)
    {
      //how to return the querys list here?  caller expecting a promise
    }   

    var promise = $http.post("php/datapump.php", { action: "FETCH", item: "QUERYS", id1: null, id2: null})
      .then(function (response) 
      {
         querys=response.data;
         return querys;
      });
    return promise; // Return the promise to the controller
  };
});

在控制器初始化中,服务被调用:

queryService.loadQueryList().then(function(d) 
{
  $scope.querys = d;
  $scope.selectedquery=queryService.getSelectedQuery();
});

或者有更好的方法吗?我可以想象在服务中设置一些标志来解决这个问题,但它看起来很难看。我只是想避免第二次获取数据。

4

1 回答 1

2

您可以创建自己的承诺并立即解决。这比设置标志并直接返回一些缓存数据要好得多,因为它使您的服务接口保持一致——该方法总是返回一个承诺。

 var deferred = $q.defer();
 deferred.resolve(yourdata);
 return deferred.promise;

您显然需要将 $q 注入您的服务。

于 2013-11-13T22:49:46.180 回答