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);
});
}