AJAX,将附加变量传递给回调并将XMLHTTLRequest.response存储到变量中

时间:2015-10-10 17:50:32

标签: javascript ajax xmlhttprequest

我正在尝试使用标准函数loadDoc(url,cfunc)读取服务器上的本地文件,然后

1)搜索文件中的特定字符串(getLine());

2)如果可能,将该行存储到变量中。

对于第1点,我将字符串传递给回调。 2)获得响应是有问题的,因为XMLHTTPRequest是异步的。此时错误是: “ReferenceError:xhttp未定义”

col+row

data.txt是这样的:

function main(){
    var url="data.txt"
    var str="1,0,"; //just an example
    var myCallBackWithVar = function(){
        getLine(str);
    };
    loadDoc(url, myCallBackWithVar);

    //Can I get the line here somehow?
}

function loadDoc(url, cfunc) {
    var xhttp=new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
        cfunc(xhttp);
        }
    }
    xhttp.overrideMimeType('text/plain');
    xhttp.open("GET", url, true);
    xhttp.send();
}

//Find string with the desired data in txt file
function getLine(str) {
    var data=xhttp.responseText;
    //Find the line from the txt file
    var start=data.indexOf(str);
    var end=data.indexOf(";",start);
    var line=data.substring(start,end);    
    return line;
}

我已经尝试传递XMLHTTPRequest对象getLine(xhttp,str)。如何解决第1点和第2点?我宁愿暂时保持jQuery免费。谢谢

2 个答案:

答案 0 :(得分:1)

完成后,您不需要通过回调函数传递整个xhttp变量。当你这样做时:

function getLine(str) {
    var data=xhttp.responseText;

xhttp已经超出了范围。要解决此问题,参数名称也必须是xhttp。

更好的方法是:

cfunc(xhttp.responseText);

然后

var data=str

这样,你只传递你需要的参数。

答案 1 :(得分:1)

  

我能以某种方式获得这条线吗?

我认为这不是一个好主意。您无法确定您的应用是否可以正常运行。 XHR是一个异步函数,你应该使用异步架构。

这里是如何完成此功能的示例。

    var text; // define global variable
    var str = "1,0,"; //just an example

    function main(){
        var url = "data.txt";
        var cb = function (data){
            text = getLine(data);
            // you can use text var here
            // or in anyewhere in your code
        }

        loadDoc(url, cb);
    }

    function loadDoc(url, cb) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                cb(xhr.responseText);
            }
        }
        xhr.overrideMimeType('text/plain');
        xhr.open("GET", url, true);
        xhr.send();
    }

    //Find string with the desired data in txt file
    function getLine(data) {
        if(data) {
            //Find the line from the txt file
            var start = data.indexOf(str);
            var end = data.indexOf(";", start);
            var line = data.substring(start, end);

            return line;
        }
    }