使用 Javascript 将 FB.api 调用的响应保存到带有 for 循环的数组中

Saving FB.api call's response to an array with a for loop with Javascript

本文关键字:for 循环 数组 响应 Javascript FB api 使用 调用 保存      更新时间:2023-09-26

我正在尝试编写一个脚本,该脚本1)从文本输入字段中读取FB用户ID并将它们循环到数组中2)使用每个ID调用FB.api作为名字,并将返回的名字值保存到另一个数组中。问题:由于某种原因,从FB.api收到的所有名字都保存到同一个数组索引位5。这特别奇怪,因为循环应该只从索引 1 到 4。

<script type="text/javascript">
var ids = new Array();
var names = new Array();
var fields = 4;

function firstNames() {
var i;
var k;

for (i=1;i<=fields;i++)
    {
        ids[i] = document.getElementById("field"+i).value;
    }
for (k=1; k<=fields; k++)
    {
        FB.api('/'+ids[k], function(response) {
            names[k] = response.first_name;
            alert(k+' test '+names[k]);
        });
    }
}
</script>

有没有人遇到过类似的事情?任何帮助将不胜感激。

事先谢谢。

阅读:Javascript,node.js和for循环
看:实验 #7:使用新作用域建立新变量
的闭包网址: http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops

我和你有同样的问题,即 FB.api 获取 FOR 循环最终迭代索引......

请尝试以下解决方案:

for (k=1; k<=fields; k++)
{
  // Closure with new scope establishing a new variable
  (function() {
    var index = k; // new variable
    FB.api('/'+ids[index], function(response) {
        names[index] = response.first_name;
        alert(index+' test '+names[index]);
    });
  }();
}

更新:需要注意的一件事是,此示例中的警报可能不会按顺序发生,即您可能会得到 1,4,2,3... 这完全取决于每个 API 调用的网络延迟以及它们的执行顺序......

这不是同一个 API 调用,但我实际上遇到了类似的事情。

你必须明白,facebook api调用是异步的。最重要的是,它很慢。所以javascript要快得多,当第一个响应被发送时,你的javascript for loop已经完成了。这就是为什么所有内容都被发送到 k=5 中,这是循环后的 k 值。

发生这种情况是因为javascript不会像java那样强迫你在处理程序中使用最终变量。

所以现在你明白了,如何解决它?呵呵,对不起,当我遇到这种问题时,我想出了一个肮脏的解决方案。

我所做的是直接在函数(响应)主体中处理代码,而不是使用中间变量。因此,作为快速修复,您可以执行相同的操作,忘记名称数组,或者找到更好的方法。