在AngularJS中使用promise进行多次资源调用

时间:2014-04-01 15:27:32

标签: javascript angularjs ng-options ngresource

我正在开发一个简单的AngularJS应用程序,它对用户进行身份验证并显示与用户关联的事务列表。此外,还有一个下拉列表,允许用户按年度过滤交易。组合框模型是我通过AngularJS资源从API检索的值数组,但只有在我检索到当前用户之后。这是代码:

    //retrieve the user
    UserManagement.getCurrentUser().then(function (user) {
        //retrieve the transactions
        $scope.transactions = Transactions.query({ 
                                                  userid: user.UserName, 
                                                  status: $scope.status 
                                                 }); 
        //retrieve the array for the dropdown
        //and return a promise
        return TimeFilters.get({ 
                                userid: user.UserName, 
                                status: $scope.status, 
                                timefilter: 'years' 
                               });
     }).then(function (years) {
             //set a scope variable to the array to bind in the view
             $scope.timefilters.years = years;
             console.debug(years);
             //set also the currently selected year
             $scope.timefilters.currentYear = $scope.timefilters.years[0];
     })

即使我今天学会了承诺,也许我误解了一些东西,但这段代码似乎很简单。

问题在于,当我尝试将currentYear分配给timefilters.years的第一个元素时,分配失败,因为数组仍然是空的,即使它不应该是,因为我我正试图在.then函数中进行分配。结果是下拉列表中填充了年份,但未选择年份。

我在这里误解了什么?

顺便说一下,资源调用会返回预期的数据,所以这不是问题。

编辑:发布后我将第一个then中的return语句更改为:

return TimeFilters.get({...}).$promise

现在它按预期工作。但我认为$ resource.get本来是要回报一个承诺。我真的很困惑。有人可以澄清吗?

1 个答案:

答案 0 :(得分:1)

Angular $resources docs有答案:

  

重要的是要意识到调用$ resource对象方法   立即返回一个空引用(对象或数组取决于   IsArray的)。一旦数据从服务器返回现有数据   引用填充了实际数据。

  

资源实例和集合具有这些附加功能   属性:

     

$ promise:创建的原始服务器交互的承诺   这个实例或集合。

     

成功时,使用相同的资源实例解析promise   集合对象,使用来自服务器的数据进行更新。

因此,在调用$ resource.get()时,请务必获得类似于对空ObjectArray的引用。只有$resource.get().$promise,您才会收到deisred promse对象。