当前位置: 首页 > 知识库问答 >
问题:

解决$q.all中Angularjspromise的正确方法是什么

庾远航
2023-03-14

我在解决使用q.all美元的promise时遇到了问题,有人能帮我吗?

当我有一个promise时,以下几点很好:

 var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData);
    dashlettePromise.then(function(data) {
      var template = '<div class= "allChartsDiv">';

      for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) {
        var dashletteId = data.tabDetails[dashVar].dashletteId; // Added
         ....
      }
    }, function(error) {
      alert(error);
    }, function(progress) {
      // report progress
    });

但是我需要进行多个ajax调用,所以我使用了$q.all如下所示:

var promises = [];
angular.forEach(dashboardslayoutArray, function(dashboardslayout) {
  dashboardData.dashletteBeansList = [];
  dashboardData.dashletteBeansList[0] = dashboardslayout;
  var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData);
  promises.push(dashlettePromise);

});

现在我需要一个接一个地解析$q中的所有promise,就像我解析的单promise一样,如上所示。因此,我使用了下面所示的代码,但它没有按预期工作。我开始怀疑我在$q.all(promise)中使用的逻辑来解决promise。这是正确的方法吗?或者有人能提出更好的方法来解决$q.all中的promise吗?

$q.all(promises)
  .then(function(allData) {
    // all promises were resolved here                          
    angular.forEach(promises, function(eachPromise) {

      eachPromise.then(function(data) {

        for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) {
          var dashletteId = data.tabDetails[dashVar].dashletteId; // Added
          var axisType = data.tabDetails[dashVar].axisType;
            .....
        }

      }, function(error) {
        alert(error);
      })

    })

  });

共有1个答案

杜弘伟
2023-03-14

问题在于,$q.all不会在已解决状态下返回promise本身,而是直接返回其值。因此,尽管您希望在$q.all调用中得到promise,但您得到的是值。为了规避这一点,您可以在结束时访问promise。

尝试调整代码以处理值,而不是中的promise。所有呼叫:

$q.all(promises)
  .then(function(allData) {
    // all promises were resolved here                          
    allData.forEach(function(data) {
    // no `then` needed here
        for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) {
          var dashletteId = data.tabDetails[dashVar].dashletteId; // Added
          var axisType = data.tabDetails[dashVar].axisType;
            .....
        }
    });
});

因此,一般来说,您的方法是有效的(很好),但可以更好:)

还请注意,进度事件可能应该避免,而不是未来的证据。

 类似资料:
  • null 我正在用trie把字典里的所有单词都倒置起来。然后,为了解决这些查询,我按照以下方式进行:- 如果trie中有单词,请将其从trie中删除。 现在从根遍历trie,直到查询字符串中的字符与trie值匹配的点。让最后一个字符匹配的点为p。 现在从这一点P开始,我使用DFS遍历trie,在遇到叶节点时,将形成的字符串推送到可能的结果列表。 现在,我将从该列表返回词典中最小的结果。 当我在SP

  • 我从Codibility的代码测试练习中发现了以下问题: 给出了一个由N个不同整数组成的零索引数组A,该数组包含范围[1...(N 1)]的整数,这意味着正好缺少一个元素。 你的目标是找到缺失的元素。 编写一个函数: 类解决方案{公共int解决方案(int[]A);} 即,给定一个索引为零的数组A,返回缺失元素的值。 例如,给定一个数组: A[0]=2A[1]=3A[2]=1A[3]=5 函数应该

  • 问题内容: 我有2个函数,都返回诺言: 现在,我有了一个清单,在这两个诺言得到解决后,我想立即更新 已解决的主题应如下所示 问题答案: 创建一个承诺,当您通过的所有承诺均被拒绝或 任何 拒绝时,该承诺都会自动解决。 如果像您一样将其传递给数组,则处理成功解析的函数将收到一个数组,其中每个项目都是针对相同索引的诺言的分辨率,例如: 我个人认为传递对象更具可读性,这样您就可以在处理程序中获得一个对象,

  • 问题内容: 我注意到Java浮点精度的一些问题 我不仅有问题,而且也有问题。 有人可以解释幕后发生的事情吗,我们如何获得准确的数字?处理这些问题时正确的方法是什么? 问题答案: 问题是精度有限。它不能完全代表。(当然,也是如此:它具有更高的精度,但仍然是有限的。) 使上述问题更加明显的另一个问题是a 而不是a ,因此您将被提升为执行减法的操作,当然,此时系统无法恢复a所丢失的精度。 本来 可以代表

  • 我在尝试连接magento v2时遇到此错误。0.2 SOAP API。 我正在本地主机上运行 我尝试了大多数解决方案,但没有一个奏效。 安装SOAP ssl存在于php.ini文件 在文件中获取内容不返回任何内容

  • 问题内容: 这个问题应该比关于更多。 我有一个子类(在python 2.7中,numpy 1.6.2),并且我发现在对象时未列出的字段名称(因此,ipython的自动完成功能无效)。 为了修复它,我尝试在子类中重写,如下所示: 结果是:。(我发现这里实际上应该在python 3.3中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正