返回XMLHttpRequest.onreadystatechange

时间:2015-04-26 16:11:48

标签: javascript ajax knockout.js

我有这个功能:

    function getDatas() {
    var xmlhttp = new XMLHttpRequest();
    var response = null;
    xmlhttp.open("POST", "getdatas.php", true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState === 4) {
            if(xmlhttp.status === 200) {
                response = xmlhttp.responseText;
                return response;
            }
            else {return xmlhttp.statusText;}
        }
    };
    xmlhttp.send(null);
}

响应采用JSON格式并正确填充。 如何将响应返回给另一个用途,如:

var datas = getDatas();

更新: 回调后我有这个:

function AppViewModel() {
    var _self = this;
    getDatas(function(error, result) {
        if(error) {
            alert(error);
        } else {
            _self.datas = result;
            console.log(_self.datas);
        }
    });
    console.log(_self.datas);
}

第一个console.log(_self.datas);效果不错,但第二个未定义。

1 个答案:

答案 0 :(得分:0)

AJAX是异步的,所以你不从这些函数返回任何值,你使用回调并使用回调中的值:

function getDatas(callback) {
    var xmlhttp = new XMLHttpRequest();
    var response = null;
    xmlhttp.open("POST", "getdatas.php", true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState === 4) {
            if(xmlhttp.status === 200) {
                response = xmlhttp.responseText;
                callback(null, response);
            }
            else {
               callback(xmlhttp.statusText, null);
            }
        }
    };
    xmlhttp.send(null);
}

然后当你调用getDatas函数时,你提供了一个回调,当AJAX请求完成时它将被调用,它将包含结果或错误:

getDatas(function(error, result) {
    if (error) {
        alert('An error occurred while retrieving data: ' + error);
    } else {
        // Use the result variable here
    }
});