我不熟悉在angularjs中使用promises的问题,目前在生成某些输出方面遇到困难。我正在尝试使用for循环生成句子数组,每个句子都通过“ levelName:groupName-description”。

我有一个名为“ prodFactory”的工厂,该工厂使用$ http.get通过getLevelNames(),getGroupNames(levelName)和getGroupData(groupName)方法获取levelName,groupName和说明。从我的源文件中,我有一个3个levelName的数组,每个名称与一个2个groupNames的数组相关联。当运行下面的代码时,我尝试记录这些值,并得到以下结果:

i = 229,j = 2,data1 =我定义的级别名称,data2 =我定义的组名称。

尽管我可以获取级别和组名,但是由于i和j的值与for循环所定义的不同,因此我得到的结果为“未定义:未定义-说明”。

反正有没有得到正确的输出?谢谢!

程式码片段

prodFactory.getLevelNames().then(function(data1){
            var suggestions = [];
            $scope.data1 = data1;
            for(i=0; i<data1.length; i++){
                prodFactory.getGroupNames(data1[i]).then(function(data2){
                    $scope.data2 = data2;
                    for(j=0; j<data2.length; j++){
                        prodFactory.getGroupData(data2[j]).then(function(data3){
                                $scope.data3 = data3;
                                for(k=0; k<data3[0].length; k++){
                                    console.log(i);
                                    console.log(j);
                                    console.log(data1);
                                    console.log(data2);
                                    suggestions.push($scope.data1[i]+": "
                                    +$scope.data2[j]+" - "+$scope.data3[0][k]);
                                };
                            });
                };
                });
        };
        $scope.getSuggestions = suggestions;
        console.log($scope.getSuggestions);
    });

最佳答案

您的代码中的最后一个console.log将在任何HTTP请求完成之前执行。那是因为承诺总是异步的。

循环创建promise使以后处理结果变得更加困难。您需要$q.all$q.spread或一些Array来添加结果。另外,发出大量HTTP请求将无法执行。您应该始终限制请求的数量。

我建议使用可以返回所有级别,组等结果的方法。

prodFactory.getLevelNames().then(function(data1){
  prodFactory.getGroupNames(data1).then(function(data2){
    prodFactory.getGroupData(data2).then(function(data3){
      $scope.suggestions = makeSuggestions(data1, data2, data3)
      console.log($scope.suggestions);
    });
  });
};


并且请不要创建名为getSuggestions的变量。看起来它是方法/函数而不是变量。

关于javascript - Promise函数无法访问父变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38230048/

10-13 00:26