Instagram API 响应 - 数组长度奇怪

Instagram API response - array length bizarre

我 运行 与收到的 Instagram API 回复撞墙了。我只是在检查重复项后将每个标记调用响应的数据对象推送到我的空结果数组中。

生成的数组行为异常。在控制台中,结果数组显示了完整的结构,并表示长度为 5,正如预期的那样。但是,当记录 results.length 时,它显示的长度为零。我创建了一个带有虚拟对象的测试数组作为比较,以显示它应该如何表现。

下面是我的控制台截图。

奇怪的是 results.length 似乎在 for 循环检查重复项中正常运行。

            var token = 'MY_TOKEN',
                userid = MY_ID,
                num_photos = 33,
                hashtags = ['website', 'engraving', 'weddinginvitations', 'customstationery'],
                results = [],
                test_results = [{id:1},{id:2},{id:3}]; 

            // LOOP THROUGH EACH HASH
            for(i = 0; i < hashtags.length; i++){
                // MAKE AJAX CALL PER HASH
                $.ajax({
                    url: 'https://api.instagram.com/v1/tags/' + hashtags[i] + '/media/recent',
                    dataType: 'jsonp',
                    type: 'GET',
                    data: {access_token: token, count: num_photos},
                    success: function(response){
                        // CHECK EACH IMAGE IN THE RESPONSE DATA AND REMOVE DUPLICATES
                        for( x in response.data ){
                            var exists = false;
                            for(var i=0;i<results.length;i++){
                                if( results[i].id === response.data[x].id ){
                                    exists = true;
                                    break;
                                }
                            }
                            if(exists === false){
                                results.push(response.data[x]);
                            } 
                        }
                    },
                    error: function(data){
                        console.log(response);
                    }
                }); 
            } 


            console.log(results);
            console.log(results.length);

            console.log(test_results);
            console.log(test_results.length);

success 函数是异步执行的,开发工具会在您展开对象时评估对象的内容。

如果您查看第一次记录的数组的屏幕截图,您会发现它显示为空。只有展开后才能看到它的内容。在记录它和扩展它之间,成功函数有足够的时间 运行 并填充它。

ajax 调用是异步的,因此您的长度为 0,因为 none 调用已完成。因此,将 console.log 移动到成功回调中,如下所示:

if(exists === false){
    results.push(response.data[x]);
} 
if(i === hashtags.length-1){
   console.log(results);
   console.log(results.length);
}