Javascript 从AJAX中的onreadystatechange事件返回值
我试图为下面代码中的变量Javascript 从AJAX中的onreadystatechange事件返回值,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图为下面代码中的变量val赋值: var cmdValue = "/cmd/fetch?x="; var val; var returned_data; function what(){ val = update('#TAG#'); } function update(tag) { var req1 = newXMLHttpRequest(); req1.open("GET",cmdValue + tag, true); req1.send("");
val
赋值:
var cmdValue = "/cmd/fetch?x=";
var val;
var returned_data;
function what(){
val = update('#TAG#');
}
function update(tag) {
var req1 = newXMLHttpRequest();
req1.open("GET",cmdValue + tag, true);
req1.send("");
return req1.onreadystatechange= function () {
if (req1.readyState == 4 && req1.status == 200) {
returned_data = req1.responseText;
return returned_data;
}else{
}
};
}
我在跟踪Firebug中的变量,结果是
val
被分配了函数。是否有办法让代码运行,然后将值赋给变量val
在异步编程中,您不返回数据,因为您不知道数据何时可用-它是异步的
// should have a space after new or was did u notice it
var req1 = new XMLHttpRequest();
异步编程的方法是使用事件和/或回调
例如:
var cmdValue = "/cmd/fetch?x=";
var val;
var returned_data;
var performSomeAction = function(returned_data) {
val = returned_data;
}
function what(){
update('#TAG#',performSomeAction);
}
function update(tag,callback) {
var req1 = newXMLHttpRequest();
req1.open("GET",cmdValue + tag, true);
req1.send("");
req1.onreadystatechange= function () {
if (req1.readyState == 4 && req1.status == 200) {
returned_data = req1.responseText;
//fire your callback function
callback.apply(this,[returned_data]);
}else{
}
};
}
这个问题是最常被问到的问题之一,至少在涉及javascript标记时是如此——在问自己的问题之前,请搜索类似的问题。由于
val
是一个全局变量(现在不太推荐),您可以执行var=returned\u data代码>我将val作为一个全局变量,以便在firebug中跟踪它。你的意思是val=returned_data吗?是的,sry我的意思是ajax请求是否会等待响应,然后才能完成其余的代码。如果没有,那么你所建议的将不起作用。很抱歉,有一个名为newXMLHttpRequest
的对象/函数,该函数只检查浏览器是否为IE,然后创建XMLHttpRequest对象。作为js的新手,这是相当困难的,因为我从来不知道正确的关键字。是的,我已经发现了一个类似的问题。谢谢。如果我使用的是同步代码(打开的最后一个参数为false),该怎么办?@Niko您不应该将async
参数设置为false
。这将锁定浏览器,直到服务器响应。请始终使用适当的异步技术。这在典型的浏览器应用程序中可能是一个问题,用户希望看到内容,但在不同的上下文中可能有意义。我想您可以将回调函数传递给“update”函数,并在收到响应时调用该函数。@Niko-同步调用永远没有意义,因为在请求完成之前,无法向用户提供浏览器UI和反馈的锁。让我们假设他们的Wifi断开了一秒钟——我的浏览器崩溃了吗?当我点击任何东西时,界面没有提供任何反馈,甚至没有显示(动画)加载程序-整个UI都冻结了?我需要CTRL+ALT+删除它吗Synchronous XMLHttpRequests=总是坏的
,句号。