用于循环ajax潜在竞争条件的Javascript
Javascript for loop ajax potential race condition?
下面是我正在运行的一个简单循环:
for (var key in TestApp.config.services) {
if (TestApp.config.services[key].files != "") {
var files = TestApp.config.services[key].files.split(',');
for (var i = 0; i <= files.length - 1; i++) {
var file_url = files[i];
console.log("About to download :" + file_url);
$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent(file_url) + '&callback=?', function(data) {
console.log("Downloaded file: " + file_url);
console.log(key);
});
}
}
}
问题是,在JSON请求完成时,key
的值总是相同的。如何避免这种竞争条件,以便在$.getJSON
完成时使用正确的key
值?
您需要一个立即调用的函数表达式(IIFE):
for (var key in TestApp.config.services) {
if (TestApp.config.services[key].files != "") {
var files = TestApp.config.services[key].files.split(',');
for (var i = 0; i <= files.length - 1; i++) {
var file_url = files[i];
console.log("About to download :" + file_url);
// IIFE
(function(thiskey,this_file_url){
$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent(this_file_url) + '&callback=?', function(data) {
console.log("Downloaded file: " + this_file_url);
console.log(thiskey);
});
})(key,file_url);
}
}
}
一个简单的解决方案是简单地将密钥与请求一起发送。我更喜欢用{}符号来写。
让我给你一个答案的基础;我将忽略带有文件的部分,以强调在哪里查看。
index.php
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
var items = ['Hello', 'World', 'foo', 'bar'];
for (var i=0; i < items.length; i++) {
console.log("About to download :" + items[i] + '" - key: ' + i);
$.getJSON( "ajax.php",
{
url: items[i],
key: i
},
function(data) {
var key = data.key;
console.log("Downloaded file: " + data.url + '" - key: ' + key);
}
);
}
</script>
ajax.php
<?php
echo json_encode(array('url'=>$_GET['url'], 'key'=>$_GET['key']));
?>
相关文章:
- 模棱两可的multi_select过滤器 - AND 和 OR 条件 - javascript
- 基于浏览器窗口大小的条件 JavaScript 执行
- 根据条件 JavaScript 在父级下对类似的数组项进行分组
- 什么时候会如果else打破所有条件javascript
- 使用 Rails 3.2,是否应避免在视图中包含条件 JavaScript
- IE8 条件 JavaScript 未链接
- 条件Javascript重定向已中断
- 通过条件Javascript分块数组
- 谷歌地图值的条件javascript
- 根据条件javascript对数组元素进行分组或重新排列
- 需要根据条件javascript再次循环
- 为web窗体下拉菜单设置条件javascript
- 是这种方法的条件javascript加载的任何值
- 条件javascript公式取决于checkbox是否被选中
- 优化条件javascript
- 插入和执行条件javascript
- 在 中使用多个条件?:JavaScript 中的语句
- 如何自动使如果条件javascript
- 用于移动的条件Javascript
- 警告,如果重复的条目插入到数据库的唯一条件javascript