Javascript For循环成功地将元素添加到数组中,但之后返回空数组
因此,这段代码成功地运行并将元素添加到数组中,通过将元素记录到控制台来确认,但在返回数组后,返回的是空的。我整个上午都在用这个把头撞在墙上Javascript For循环成功地将元素添加到数组中,但之后返回空数组,javascript,arrays,angularjs,for-loop,Javascript,Arrays,Angularjs,For Loop,因此,这段代码成功地运行并将元素添加到数组中,通过将元素记录到控制台来确认,但在返回数组后,返回的是空的。我整个上午都在用这个把头撞在墙上 details.getDetails = function(idSet, pageNum) { var page = idSet[pageNum], placeDetails = [], i; for(i=0; i<page.length; i++){ ngGPlaces
details.getDetails = function(idSet, pageNum) {
var page = idSet[pageNum],
placeDetails = [],
i;
for(i=0; i<page.length; i++){
ngGPlacesAPI.placeDetails({placeId: page[i]})
.then(function(data){
response = data;
placeDetails.push(response);
console.log(placeDetails) //This shows the loop running and the array being populated
})
}
return placeDetails;
console.log(placeDetails) //This returns empty array
};
details.getDetails=函数(idSet,pageNum){
var page=idSet[pageNum],
placeDetails=[],
我
for(i=0;i这里的问题是.placeDetails会立即返回,因此for循环在您实际检索到一些数据之前就已经完成了。这就是为什么在这里使用承诺并不能真正帮助您,因为解析调用几乎会立即被调用
我建议您在完成对placeDetails的所有呼叫之前,先查看$q.all,然后再解决您的承诺
类似这样的(未经测试的)代码应该适合您。它可能需要一些更改,但应该会给您一个想法
details.getDetails = function(idSet, pageNum) {
var page = idSet[pageNum],
placeDetails = [],
mainDeferred = $q.defer(),
promises = [];
for(var i=0; i<page.length; i++){
var deferred = $q.defer();
ngGPlacesAPI.placeDetails({placeId: page[i]})
.then(function(data){
placeDetails.push(data);
deferred.resolve();
});
promises.push(deferred.promise);
}
$q.all(promises).then(function() {
mainDeferred.resolve(placeDetails);
});
return mainDeferred;
});
details.getDetails=函数(idSet,pageNum){
var page=idSet[pageNum],
placeDetails=[],
main deferred=$q.deferred(),
承诺=[];
对于(var i=0;iYou正在处理异步
事件..为什么投票失败?我知道我做错了什么,这就是我问的原因。谢谢你的回答。我运行了上面的代码,它创建了承诺数组,然后返回一个承诺,但当我尝试在控制器中使用该承诺时,代码details.getDetails(page,pageNum).then(function(response){vm.restaurants=response;console.log(vm.restaurants);})
我没有在控制台上记录任何东西,但也没有发现任何错误。@GrantJordan正如我所说的;我给你的代码是给你一个大概的想法,而不是银盘上的解决方案:-)您可能需要进行一些调试才能正常工作。例如,不要使用全局数组,而是在resolve函数中传递.placeDetails()
的结果,然后在$q.all()
中添加所有结果的值。您可以查看有关all()的更多信息功能。非常感谢你让我走上正确的轨道。通过一点调整,我让一切都运转起来。
details.getDetails = function(idSet, pageNum) {
var page = idSet[pageNum],
placeDetails = [],
mainDeferred = $q.defer(),
promises = [];
for(var i=0; i<page.length; i++){
var deferred = $q.defer();
ngGPlacesAPI.placeDetails({placeId: page[i]})
.then(function(data){
placeDetails.push(data);
deferred.resolve();
});
promises.push(deferred.promise);
}
$q.all(promises).then(function() {
mainDeferred.resolve(placeDetails);
});
return mainDeferred;
});