For 循环成功地将元素添加到数组中,但在之后返回空数组
For loop adds elements to array succesfully but returns empty array after
所以这段代码成功运行并将元素添加到数组中,通过将它们记录到控制台来确认,但之后,当我返回数组时,它返回为空。我整个早上都在用这个头撞墙。
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
};
我确实认为问题可能与 Rayon 提到的异步数据有关,我试图返回一个承诺,但我不确定我做得对。这是我尝试过的代码。
.factory('details', function(ngGPlacesAPI, $q){
var response,
details = {};
details.getDetails = function(idSet, pageNum) {
var page = idSet[pageNum],
deferred = $q.defer,
placeDetails = [],
i;
for(i=0; i<page.length; i++){
ngGPlacesAPI.placeDetails({placeId: page[i]})
.then(function(data){
response = data;
placeDetails.push(response);
})
}
deferred.resolve(placeDetails);
console.log(deferred.promise);
return deferred.promise;
};
// Return Details Object
return details;
});
这里的问题是 .placeDetails 会立即返回,因此在您实际检索一些数据之前,for 循环早已完成。这就是为什么在这里使用 Promise 并不能真正帮助您,因为解析调用几乎会立即调用。
我建议调查一下 $q.all,等到你对 placeDetails 的所有调用都完成之后,再解决你的承诺。
像这样(未经测试的)代码应该适合你。它可能需要一些更改,但它应该给你一个想法。
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;
});
相关文章:
- 如何使用Jquery水平打印表中的数组元素,并在某个元素之后垂直打印
- Javascript删除数组中某个位置之后的项
- 数组在JavaScript中不是null,但在PHP'Ajax之后的s$_POST
- 如何在加号运算符之后选择数组元素的一部分
- 如何在Javascript中的对象数组的最后一个对象之后附加几个新对象
- 用于在数组比较之后由于某种原因而爆发循环
- 在JavaScript中,按日期和之后的名称过滤数组
- For 循环成功地将元素添加到数组中,但在之后返回空数组
- 在 sort() 之后,十进制数的 JavaScript 数组顺序不正确
- 在 .slice 之后重置 JSON 数组
- 异步:在回调中获取 For 之后的空数组
- 在 Jquery Ajax IE 之后访问 getElementsByName 数组
- 在 JavaScript 函数之后保留原始数组
- 未引用的数组在“切片”之后不那么未引用
- 为什么在 Promise.all() 之后没有调用 onJect,其中数组中包含的 Promise.reject() 传
- 在javascript中从矢量数组创建2D矩阵.- 缺少 ) 在参数列表之后
- 在输入数组的 split() 和子字符串 () 之后的文本区域中显示
- 在 JavaScript 中获取某个索引之后的数组中的所有元素
- 第一个100个素数javascript,为什么在我的素数数组之后没有定义
- 在数组之后添加断点