带有$http调用的AngularJS工厂响应准备就绪时我是否应该关心?

带有$http调用的AngularJS工厂响应准备就绪时我是否应该关心?,http,callback,angularjs,Http,Callback,Angularjs,我有一个类似的工厂,里面有$http调用,如下所示: appModule = angular.module('appModule', []); appModule.factory('Search', function($rootScope, $http) { var Search; Search = {}; Search.types: ["bacon"]; Search.pastEvents = null; $http.get('api/highlights').succe

我有一个类似的工厂,里面有$http调用,如下所示:

appModule = angular.module('appModule', []);

appModule.factory('Search', function($rootScope, $http) {
  var Search;
  Search = {};
  Search.types: ["bacon"];
  Search.pastEvents = null;
  $http.get('api/highlights').success(function(response) {
    return Search.pastEvents = response.data;
  });
  return Search;
});

var notes_module = angular.module('notes', []);

notes_module.config(['$routeProvider', function ($routeProvider) {

  var notes_promise = ['Notes', '$route', 'Search', function (Notes, $route, Search) {
    //suspect that Search not having pastEvents ready in time of calling index method
    //Notes resource  
    return Notes.index({subject_id: 1 }, Search);    
  }];

  $routeProvider.when('/notes', {
    templateUrl:'index.tpl.html',
    controller:'NotesCtrl',
    resolve:{
      notes: notes_promise,
    }
  });

}]);
我是否应该关心来自$http调用的数据何时准备就绪以及此工厂何时初始化/注入?准备好了吗?如果我在乎,我该怎么办

我怀疑搜索对象在调用Notes资源的索引方法时没有准备好PasteEvents。

这取决于:

如果您立即在
$scope
中放入要使用的内容,例如在
ng repeat
中,则不会

如果您需要在控制器中输入另一个函数,则是。例如,如果在控制器的过滤功能中使用
粘贴事件
。在这种情况下,最好将所有操作都保留在服务内部,并使用
$q
来解决异步问题

(这只是一个例子)

一点解释。数据随服务中的事件一起到达。此时可能已经调用了
getApp()
。但这并不重要,因为
$q
将确保数据只有在稍后到达时才会被过滤。控制器不需要知道,只要它不尝试执行以下操作:

$scope.app = service.getApp();
for(var i = 0; i < $scope.app.pastEvents.length; i++) {
   ...
} 
编辑:

appModule.factory('Search', function($rootScope, $http, $q) {
  var deferred = $q.defer();
  $http.get('api/highlights').success(function(response) {
    deferred.resolve({
       type: ["bacon"],
       pastEvents: response.data)};
  });
  return deferred.promise;
});
我认为,在您的情况下,当您在
$routeProvider中使用它时,
搜索
尚未解决:

Notes.index({subject_id: 1 }, Search)
因此,请尝试解析
搜索
,并使用控制器中的
注释
资源

您需要在
搜索
服务中返回承诺。两种选择:

  • 返回$http承诺,但如果需要首先处理数据,那么这可能不是您想要的
  • 使用$q并回报其承诺
$q示例:

appModule.factory('Search', function($rootScope, $http, $q) {
  var deferred = $q.defer();
  $http.get('api/highlights').success(function(response) {
    deferred.resolve({
       type: ["bacon"],
       pastEvents: response.data)};
  });
  return deferred.promise;
});

你能再具体一点吗?“行为异常”的确切含义是什么?如果您担心在渲染视图之前数据是否可用(以避免闪烁),请检查此项。感谢您的回答,我将检查它。当你发布你的答案时,我已经更新了我的问题,使之更加清晰…仍然停留在这个问题上,你能帮我解决更新后的问题吗?是的,你是正确的。检查firebug设置断点我在返回时没有看到任何粘贴事件
Notes.index({subject_id:1},Search)。对象存在,但为空。是的,我可以切换解析`resolve:{notes:notes\u promise,}`和解析搜索。但既然搜索只是一个“纯”的JS对象,那该怎么办呢?我添加了一个$q示例。你需要在你的搜索服务中回报一个承诺。谢谢你,我让它工作了。我是否以更一般的方式提出了正确的问题:如何在控制器中更改路由之前解决两个工厂A B,以及如何在解决A的帮助下解决工厂B?来描述剩下的疑问。。
appModule.factory('Search', function($rootScope, $http, $q) {
  var deferred = $q.defer();
  $http.get('api/highlights').success(function(response) {
    deferred.resolve({
       type: ["bacon"],
       pastEvents: response.data)};
  });
  return deferred.promise;
});