Javascript数组长度为0
我在下面得到了一些奇怪的行为,它显示了数组长度为0,尽管在此之前打印它表明长度明显大于0:Javascript数组长度为0,javascript,Javascript,我在下面得到了一些奇怪的行为,它显示了数组长度为0,尽管在此之前打印它表明长度明显大于0: var getTopSelection = function(callback) { var topSelection = []; for(var i=0; i < markers.length; i++) { if(markers[i].map !== null) { var stationID = markers[i].id;
var getTopSelection = function(callback) {
var topSelection = [];
for(var i=0; i < markers.length; i++) {
if(markers[i].map !== null) {
var stationID = markers[i].id;
getTrips(stationID, globalFromDate, globalToDate, function(response) {
topSelection.push({
StationID: stationID,
Trips: response
});
}, function(error) {
console.log(error);
})
}
}
callback(topSelection);
};
getTopSelection(function(response) {
console.log(response); //115
console.log(response.length); //116
})
var getTopSelection=函数(回调){
var topSelection=[];
对于(var i=0;i
如检查员所示,“长度:42”属于第115行
问题:为什么它显示长度为0,尽管它清楚地表示它之前有42行的长度?
似乎您正在尝试查找对象的长度,而不是实际数组。console.log
您的console.log
语句出现在调用getTrips
之后,但在触发getTrips
回调之前
实际上,你是在尝试
响应
是一个对象。JS中的对象总是被引用的。您正在记录该引用,然后当getTrips
回调触发时,对象将使用新值(和新长度)更新。新对象将反映在控制台中
响应。长度是一个数字。你正在记录它。数值不是引用。它是0
,因为在您调用console.log
时它是0
。当值更改时,显示不会更新,因为它是一个数字而不是一个对象。因此,实际发生的情况是,当您记录响应时,它的实际长度为0。但在异步响应返回后,它有42项,但作为属性的长度记录为数字。但作为对象的响应最初记录为零项。但是当收到实际响应时,对响应对象的引用将被更新,您会看到响应有42个项,长度也是42。下面的代码是在控制台中更新记录的响应后调用setTimeout
后显示的代码示例
var getTopSelection=函数(回调){
var topSelection=[];
标记=[1,2,3,4,5,6,7,8,9];
对于(var i=0;i })
响应是json对象吗?您确定响应是数组而不是对象吗?@Manish我在上面添加了填充响应的代码。它应该是一个数组。可能您的响应在打印到日志时没有填充。与此问题类似:@Niklas是在循环完成之前刚刚执行for循环之后放置的所有内容吗?我还没有弄明白为什么等待它完成会如此困难。您可以看到length
属性的值与前面的控制台的值不同。在问题的图像中记录语句。谢谢。因此,在上面的示例中,我确实需要使用该对象的(非零)长度,因为根据长度的不同,任何for循环都不会触发,所以我是否需要使用异步助手库或类似的东西?我认为这相当简单。是的,您需要等待所有getTrips
调用都解决。我会尝试将它们变成承诺,然后使用Promise.all
。