Javascript-未更新全局变量
我正在尝试更新回调函数中的全局变量(请参阅下面的代码)Javascript-未更新全局变量,javascript,jquery,Javascript,Jquery,我正在尝试更新回调函数中的全局变量(请参阅下面的代码) FunctionOne()函数{ var结果=”; 对于(变量i=0;i
FunctionOne()函数{
var结果=”;
对于(变量i=0;i<10;i++){
AJAX功能(功能(数据){
结果+=数据;
});
}
警报(结果);
}
函数AjaxFunction(回调){
$.ajax({
url:“/test”,
键入:“GET”,
成功:功能(数据){
回调(数据);
}
});
}
当我提醒
结果时
它似乎总是空白的。你们能告诉我怎么了吗?结果不是全局的,它只在FunctionOne()的范围内定义。然而,在您的示例中,您正在警告该值,因为Ajax调用似乎是异步运行的。而是尝试在更新值后发出警报
function FunctionOne() {
var result = "";
for (var i = 0; i < 10; i++) {
AjaxFunction(function (data) {
result += data;
alert(result); // this should have the value
}
}
alert(result); // this should be empty
}
FunctionOne()函数{
var结果=”;
对于(变量i=0;i<10;i++){
AJAX功能(功能(数据){
结果+=数据;
警报(结果);//该值应为
}
}
警报(结果);//这应该是空的
}
结果不是全局的,它仅在FunctionOne()
的范围内定义。但是,在您的示例中,您在将值分配为异步运行的Ajax调用之前发出警报。请尝试在更新值后发出警报
function FunctionOne() {
var result = "";
for (var i = 0; i < 10; i++) {
AjaxFunction(function (data) {
result += data;
alert(result); // this should have the value
}
}
alert(result); // this should be empty
}
FunctionOne()函数{
var结果=”;
对于(变量i=0;i<10;i++){
AJAX功能(功能(数据){
结果+=数据;
警报(结果);//该值应为
}
}
警报(结果);//这应该是空的
}
您的问题有两个部分需要解决—第一部分涉及AJAX的异步性质以及结果如何返回—因此请注意,这一部分最初被标记为的副本
第二部分是如何使最终答案取决于所有十个AJAX请求的异步完成:
function functionOne() {
// initiate ten requests, storing the promises in an array
var def = [];
for (var i = 0; i < 10; ++i) {
def[i] = AjaxFunction();
}
// wait for all the promises to complete, with the
// eventual result also being returned as a promise
return $.when.apply($, def).then(function() {
// take a copy of the arguments
var args = [].slice.call(arguments, 0);
// concatenate them all together
return args.reduce(function(prev, current) {
return prev + current[0]; // each arg is actually a 3-element array
}, "");
});
}
function AjaxFunction() {
return $.get('/test'); // NB: using promises - no callback required
};
// NB: functionOne() is now also async - you have to wait
// for the promise to be resolved before using the result
functionOne().then(function(result) {
alert(result);
)};
functionOne()函数{
//启动十个请求,将承诺存储在一个数组中
var def=[];
对于(变量i=0;i<10;++i){
def[i]=AjaxFunction();
}
//等待所有的承诺完成,并且
//最终结果也作为承诺返回
返回$.when.apply($,def).then(函数(){
//复制一份参数
var args=[].slice.call(参数,0);
//将它们连接在一起
返回args.reduce(函数(上一个,当前){
返回prev+current[0];//每个参数实际上是一个3元素数组
}, "");
});
}
函数AjaxFunction(){
返回$.get('/test');//注意:使用承诺-无需回调
};
//注意:functionOne()现在也是异步的-您必须等待
//在使用结果之前要解决的承诺
functionOne()。然后(函数(结果){
警报(结果);
)};
请参阅,以获得一个有效的演示。您的问题有两个部分需要解决—第一部分涉及AJAX的异步性质以及结果如何返回—为此,请参阅此部分最初标记为的副本
第二部分是如何使最终答案取决于所有十个AJAX请求的异步完成:
function functionOne() {
// initiate ten requests, storing the promises in an array
var def = [];
for (var i = 0; i < 10; ++i) {
def[i] = AjaxFunction();
}
// wait for all the promises to complete, with the
// eventual result also being returned as a promise
return $.when.apply($, def).then(function() {
// take a copy of the arguments
var args = [].slice.call(arguments, 0);
// concatenate them all together
return args.reduce(function(prev, current) {
return prev + current[0]; // each arg is actually a 3-element array
}, "");
});
}
function AjaxFunction() {
return $.get('/test'); // NB: using promises - no callback required
};
// NB: functionOne() is now also async - you have to wait
// for the promise to be resolved before using the result
functionOne().then(function(result) {
alert(result);
)};
functionOne()函数{
//启动十个请求,将承诺存储在一个数组中
var def=[];
对于(变量i=0;i<10;++i){
def[i]=AjaxFunction();
}
//等待所有的承诺完成,并且
//最终结果也作为承诺返回
返回$.when.apply($,def).then(函数(){
//复制一份参数
var args=[].slice.call(参数,0);
//将它们连接在一起
返回args.reduce(函数(上一个,当前){
返回prev+current[0];//每个参数实际上是一个3元素数组
}, "");
});
}
函数AjaxFunction(){
返回$.get('/test');//注意:使用承诺-无需回调
};
//注意:functionOne()现在也是异步的-您必须等待
//在使用结果之前要解决的承诺
functionOne()。然后(函数(结果){
警报(结果);
)};
请参阅,以获得一个有效的演示。您可以将var语句移出函数,使其变为全局。这也是问题的一部分-对增量的回调将在该值发出警报后发生。@RoryMcCrossan-Yup,在您键入you's comment时正在编辑我的答案。现在已更新。结果
仍然是可访问的无法通过传递的函数的闭包调用该函数。@Ian如何获得在第二个警报中显示的正确值?您只需将var语句移出该函数,使其变为全局值,这也是问题的一部分-在该值发出警报后,将发生对增量的回调。@Rorymcrossan-Yup,正在编辑我的答案当您键入注释时,您的注释已更新。result
仍然可以通过它的闭包被传递的函数访问。@Ian我如何获得正确的值以显示在第二个警报上?由于缺少,因此没有SyntaxError
)
?或者这是一个输入错误。在ajax完成之前,您正在警告该值。移动警报是您的回调函数。@TomHart不,不要-它将中断异步程序flow@RoryMcCrossan这个问题有一些在规范答案中没有提到的微妙之处,比如如何使最终结果取决于所有十个AJAX调用……没有语法错误
,因为缺少)
?或者这是一个输入错误。在ajax完成之前,您正在警告该值。移动警报是您的回调函数。@TomHart不,不要-它将中断异步程序flow@RoryMcCrossan这个问题有一些在规范答案中没有提到的微妙之处,比如如何使最终结果取决于所有十个AJAX调用……哪个版本的jQuery包含承诺?@COBOL 1.5以后的任何东西。美国