Javascript 从变量中的Ajax请求获取值

Javascript 从变量中的Ajax请求获取值,javascript,ajax,variables,Javascript,Ajax,Variables,我有这个函数 function ajaxtakesource4(callback){ var ajaxRequest; // The variable that makes Ajax possible! try{ ajaxRequest = new XMLHttpRequest(); } catch (e){ try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"

我有这个函数

function ajaxtakesource4(callback){
    var ajaxRequest;  // The variable that makes Ajax possible!
    try{
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        try{
            ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e){
                alert("Your browser broke!");
                return false;
            }
        }
    }   
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange =function(){
        if(ajaxRequest.readyState == 4 &&ajaxRequest.status==200){
            var sourcetest = ajaxRequest.responseText;  
            callback(sourcetest);
        }
    }
    ajaxRequest.open("POST", "takesource4.php", true);
    ajaxRequest.send(null); 
}
此外:

这里我把上面的函数称为:

<div id="run">
  <button id="button_run" class="button" onclick="run()">Run</button>
</div>

异步代码本质上是并发执行的。因此,您的
alert
语句可能在执行回调之前执行(回调只有在从服务器接收回数据后才会执行)。将
警报
放在回调中,它将显示返回的值,即

var somous4;
function run() {
    ajaxtakesource4(function(sourcetest){   
        somous4=sourcetest;
        alert(somous4);
    });
}
编辑:根据OP的注释,而不是考虑返回值,执行以下操作:

function foo(soumous4) { // use somous4 for whatever you want... }

// Call this function foo inside the callback.
ajaxtakesource4(function(sourcetest){   
        somous4=sourcetest;
        foo(somous4);
    });

我建议您更改run函数中的回调,如下所示:

var somous4;
function run() {
    ajaxtakesource4(function(sourcetest){   
        somous4=sourcetest;
        alert(somous4);
    });
}

在请求回调更改somous4之前,您正在发出警报。在这种情况下,命令块比请求回调先执行


服务器端语言和PHP一样自动工作,因此不需要在那里使用事件。它在请求未完成时休眠。这是因为命令块会关闭事件回调。

不清楚问题是什么
问题是,我第一次按下“运行”按钮时收到未定义的警报,
这可能是正常的,因为变量的声明在函数之前
那么这是否正常?您试图实现的是什么,以及什么没有按预期工作?您的警报语句应该在回调函数中,当您第一次单击按钮进行异步调用时,回调函数还没有调用,somous4=sourcetest也没有执行。是的,这是真的,但事实上我不想使用alert,我在示例中使用了它。我需要在run函数中使用变量somous4或sourcetest。是的,这是真的,但实际上我不想使用alert,我在示例中使用了它。我需要在run函数中使用变量somous4或sourcetest。更清楚地说,我想使用许多变量,如somous4,因此我需要函数run中的变量,而不是在ajaxtakesource4中。是的,这是真的,但事实上我不想使用alert,我在我的示例中使用了它。我需要在run函数中使用变量somous4或sourcetest。更清楚地说,我想使用许多变量,如somous4,因此我需要在函数run中使用变量,而不是在ajaxtakesource4中使用变量异步更新后需要在回调中调用的任何变量。因此,创建一个函数并在callback.in函数运行中调用它。在函数运行中,我希望接收一些变量,如soumous3,我希望从callback接收这些变量。然后我想根据这些变量运行算法。问题是我将从一个不同的函数中接收每个变量,然后编写一个函数,该函数只有在接收到所有变量后才会被调用。此外,如果可能,在单个ajax请求中发送所有数据。请看JS/ES6承诺。感谢您的回复,我理解它,但问题是我不能使用变量sourcetest或somous4。更清楚地说,我想使用许多变量,比如somous4,所以我需要函数run中的变量,而不是函数内部的变量ajaxtakesource4@SoMous然后在回调函数命令块的某处返回变量值。您不能在匿名回调函数自身外部使用
sourcetest
参数,它是函数作用域的一部分。如果您指的是函数run(){ajaxtakesource4(函数(sourcetest){somous4=sourcetest;return somous4;});somous=ajaxtakesource4();alert(somous);它不工作
function foo(soumous4) { // use somous4 for whatever you want... }

// Call this function foo inside the callback.
ajaxtakesource4(function(sourcetest){   
        somous4=sourcetest;
        foo(somous4);
    });
var somous4;
function run() {
    ajaxtakesource4(function(sourcetest){   
        somous4=sourcetest;
        alert(somous4);
    });
}