Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从AJAX中的onreadystatechange事件返回值_Javascript_Jquery_Ajax - Fatal编程技术网

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=总是坏的
,句号。