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以后的任何东西。美国