我对以下内容有一些奇怪的行为,它显示数组长度为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;
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
})
这在检查员中显示,“长度:42”属于第115行。
问题:为什么它显示的长度为0,尽管它之前明确表示它的长度为42行?
答案 0 :(得分:4)
console.log
is not synchronous。
console.log
语句在您调用getTrips
之后但在getTrips
回调被触发之前显示。
实际上,您正在尝试return the response from an asynchronous call。
response
是对象。 JS中的对象始终被引用。您正在记录该引用,然后在getTrips
回调触发时使用新值(以及新长度)更新对象。新对象将反映在控制台中。
response.length
是一个数字。你正在记录它。数值不是参考。它是0
,因为当时您致电console.log
它是0
。当值更改时,显示不会更新,因为它是数字而不是对象。
答案 1 :(得分:1)
所以实际发生的是当你记录你的响应它实际上长度为0.但是在返回异步响应之后它有42个项目但是长度是一个属性被记录为数字。但是,作为对象的响应最初会记录为零项。但是当收到实际响应时,对响应对象的引用会更新,并且您会看到响应有42个项目,长度也是42.以下代码是setTimeout
之后显示的示例。调用已记录的响应在控制台中更新。
var getTopSelection = function(callback) {
var topSelection = [];
markers=[1,2,3,4,5,6,7,8,9];
for(var i=0; i < markers.length; i++) {
if(markers[i].map !== null) {
var stationID = markers[i].id;
getTrips(stationID, function(response) {
topSelection.push({
StationID: i,
Trips: response
});
}, function(error) {
console.log(error);
})
}
}
callback(topSelection);
};
function getTrips(station,fun){
setTimeout(function(){
fun(["trip1","trip2","trip3"]);
},1000)
}
getTopSelection(function(response) {
console.log(response); //115
console.log(response.length); //116
})
&#13;
尝试在Fiddle here中执行此代码段(已相应修改以显示实际发生的情况)。并在stackoverflow片段结果中观察控制台中的输出,它将不可见。这是控制台输出的快照
希望有所帮助:)
答案 2 :(得分:-2)
您似乎正在尝试查找对象的长度,而不是实际的数组。