在 AngularJS 中使用承诺的多个资源调用

Multiple resource calls with promises in AngularJS

本文关键字:资源 调用 承诺 AngularJS      更新时间:2023-09-26

我正在开发一个简单的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 TimeFilters.get({...}).$promise

现在它按检查工作。但我认为$resource.get已经打算回报一个承诺了。我真的很困惑。有人可以澄清一下吗?

Angular $resources docs 给出了答案:

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

和:

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

$promise:原始服务器交互的承诺 此实例或集合。

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

因此,在调用 $resource.get() 时,确实希望获得对空ObjectArray的引用之类的内容。只有有了$resource.get().$promise你才会收到 deisred promse 对象。