Javascript数组长度为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;

我在下面得到了一些奇怪的行为,它显示了数组长度为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
})
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