使用 Javascript 将 FB.api 调用的响应保存到带有 for 循环的数组中
Saving FB.api call's response to an array with a for loop with Javascript
我正在尝试编写一个脚本,该脚本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那样强迫你在处理程序中使用最终变量。
所以现在你明白了,如何解决它?呵呵,对不起,当我遇到这种问题时,我想出了一个肮脏的解决方案。
我所做的是直接在函数(响应)主体中处理代码,而不是使用中间变量。因此,作为快速修复,您可以执行相同的操作,忘记名称数组,或者找到更好的方法。
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记