从AJAX中的onreadystatechange事件返回值

Sup*_*ios 4 javascript ajax jquery

我试图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{

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我正在跟踪Firebug中的变量,事实证明它val被分配了函数.有没有办法让代码运行,然后将值赋给变量val

Ada*_*dam 8

在异步编程中,您不需要 return数据,因为您不知道该数据何时可用 - 它是异步的.

进行异步编程的方法是使用事件和/或回调.

例:

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{

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这个问题是关于SO的最常见问题之一,至少在涉及到javascript标签时 - 请在问自己之前搜索类似的问题.

  • @Niko - 同步调用永远不会有意义,因为锁定浏览器UI和反馈无法提供给用户,直到请求完成.让我们假装他们的Wifi下降一秒钟 - 我的浏览器崩溃了吗?当我点击任何东西时,界面没有提供任何反馈,甚至没有显示(动画)加载器 - 整个UI被冻结了?我需要CTRL + ALT + DELETE吗?`同步XMLHttpRequests =总是坏',完全停止. (2认同)