从工厂返回已解决的承诺的结果

时间:2016-02-22 10:47:02

标签: angularjs asp.net-mvc angularjs-factory

我有一个Angular应用程序,其中包含在av MVC视图中定义的菜单。因此菜单与应用程序中的路线无关。在菜单控制器中,我想注入一个包含当前用户数据的对象。然后我将循环此对象以决定用户应该看到哪些菜单项。

工厂看起来像这样:

.factory('currentUser', ['currentUserResource', function (currentUserResource) {return currentUserResource.get()}]) 

get方法是标准的$ resource GET方法。

问题是,工厂返回一个需要很短时间才能解决的承诺。因此,在我的控制器中,一些菜单项在承诺解决之前得到处理,并且没有显示它们应该显示的时间。

在我的控制器中,我注入' currentUser',然后尝试以这些方式使用:

$scope.currentUser = currentUser.then(function (data){
  return data
});

$scope.currentUser = currentUser;

currentUser.then(function(data){
  $scope.currentUser = data;
});

有没有办法,如果没有使用路由解析,我可以确保在加载控制器之前解析了currentUser,或者至少控制器首先解析了它?

1 个答案:

答案 0 :(得分:1)

使用$promise对象的$resource属性来延迟控制器的工作。

resourceObject.$promise.then ( function onFulfilled(object) {
    //Do work that needs fulFilled object
}).catch (function onRejected(response) {
    console.log(response.status)
});;

如果resourceObject已解决,则onFulfilled功能将立即执行。如果resourceObject尚未解决,则$q服务将在调用onFulfilled函数之前等待。

  

重要的是要意识到调用$resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。

     

资源实例和集合具有以下附加属性:

     
      
  • $promise:创建此实例或集合的原始服务器交互的promise

         

    成功时,使用相同的资源实例或集合对象解析promise,并使用来自服务器的数据进行更新。这使得在$routeProvider.when()的解析部分中使用它很容易推迟视图渲染,直到资源被加载。

         

    失败时,使用http response对象拒绝承诺,但没有资源属性。

  •   

- AngularJS $resource Service API Reference