我不熟悉在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/