回调中未修改Javascript全局变量
我正在尝试循环S3存储桶中的每1000个元素。这是因为get请求最多返回1000个元素。如果有超过1000个元素,它将被分页,get请求返回一个字段调用IsTruncated为true,并返回一个marker(NextMarker)元素以传递给下一个调用,让下一个get请求在下一个1000个元素开始 我将从get请求中获取数据作为回调函数中的参数,并尝试将上述两条信息存储在全局变量中,以便在外部循环中使用。但是,外部循环变为无穷大,因为在我的get请求回调函数中从未修改过全局变量。我尝试在回调中使用window.variable,但没有效果。有人能帮我重组代码以实现我的目标吗 谢谢 出于调试目的,Outter循环被注释掉。我使用了许多调试console.log语句来确定问题的根源回调中未修改Javascript全局变量,javascript,amazon-web-services,Javascript,Amazon Web Services,我正在尝试循环S3存储桶中的每1000个元素。这是因为get请求最多返回1000个元素。如果有超过1000个元素,它将被分页,get请求返回一个字段调用IsTruncated为true,并返回一个marker(NextMarker)元素以传递给下一个调用,让下一个get请求在下一个1000个元素开始 我将从get请求中获取数据作为回调函数中的参数,并尝试将上述两条信息存储在全局变量中,以便在外部循环中使用。但是,外部循环变为无穷大,因为在我的get请求回调函数中从未修改过全局变量。我尝试在回调中
<script type="text/javascript">
s3_bucket = "link_to_s3_bucket";
var go = true;
var marker = "";
//while(go){
console.log('pass');
console.log(s3_bucket + marker);
$.get(
s3_bucket+marker,
"{}",
function(data) {
$(data).find('Key').each(function(i, key) {
key = key.innerHTML;
$("<a />", {
href : s3_bucket+key,
text : key
}).prependTo("#links");
$("<br />").prependTo("#links");
});
window.go = $(data).find('IsTruncated')[0].innerHTML;
window.marker = "&marker=" + $(data).find('NextMarker')[0].innerHTML;
},
"xml"
);
//}
console.log(go);
console.log(marker);
</script>
s3_bucket=“链接到s3_bucket”;
var go=真;
var标记=”;
//while(go){
console.log('pass');
控制台日志(s3_桶+标记器);
美元(
s3_铲斗+标记器,
"{}",
功能(数据){
$(数据)。查找('Key')。每个(函数(i,Key){
key=key.innerHTML;
$("", {
href:s3_bucket+键,
文本:键
}).prependTo(“链接”);
$(“
”).prependTo(“#链接”);
});
window.go=$(数据).find('IsTruncated')[0].innerHTML;
window.marker=“&marker=“+$(数据)。查找('NextMarker')[0]。innerHTML;
},
“xml”
);
//}
控制台日志(go);
控制台日志(标记器);
您的数据从Amazon异步返回,因此在调用这些控制台日志时,这些变量尚未定义。在变量赋值之后,将控制台日志放在回调中。是的,我已经这样做了,它确实打印了正确的值,但是,这对我没有多大帮助,因为我需要在全局上下文中更改变量assingments以使循环正常工作。它们是全局的,因为它们位于作为浏览器全局对象的窗口对象上,所以它们正在更改。@user3594685-它们正在更改。直到$.get()
函数异步完成(这意味着稍后的某个时间),新值才会出现。如果要使用Ajax调用的返回结果,必须从Ajax调用的完成处理程序使用它,方法是将使用它的代码放在那里,或者从那里调用函数并将数据传递给它。不能像现在这样从全局变量使用它。如果要使用异步调用,如$.get()
,则必须异步编程。他可以从全局变量使用它。但在请求返回之前,它将是未定义的。