有没有办法阻止我的JS代码,直到XMLHttpRequest响应到来?

时间:2015-07-01 01:04:48

标签: javascript xmlhttprequest nonblocking

我尝试使用此功能通过PHP文件导入一些数据:

sendJsonRequest("initial", startID);
json = JSON.parse(request);

function sendJsonRequest(type, id) {
    if (window.XMLHttpRequest) {
        var xmlhttp = new XMLHttpRequest();
    } else {
        var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            request = xmlhttp.responseText; //writing the response in an already defined variable
        }
    }
    xmlhttp.open("GET","../RequestHandler.php?"+type+"_"+id,true);
    xmlhttp.send();
}

数据导入效果很好。我现在的问题是我想在调用这个函数后立即使用我的请求,到目前为止它仍然不可用(我意识到这是因为onreadystatechange作为函数独立运行),因此我必须加入一些延迟直到就是这样。我发现使用setTimeout或setInterval非常不舒服,因为那些没有阻塞代码,我不得不重构一些代码非常糟糕和低效。这就是为什么我在寻找一种修改/阻止函数的方法,直到请求可用,但是建议不要使用空的while循环,也不建议等待/暂停/睡眠函数。任何人都可以找到另一种方法来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

你能通过回调吗?

function sendJsonRequest(type, id, callback) {
    if (window.XMLHttpRequest) {
        var xmlhttp = new XMLHttpRequest();
    } else {
        var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            request = xmlhttp.responseText; //writing the response in an already defined variable

            if(callback) {
                callback(request);
            }  
        }
    }
   xmlhttp.open("GET","../RequestHandler.php?"+type+"_"+id,true);
   xmlhttp.send();
}

并使用它:

sendJsonRequest("initial", startId, function(req) {
    var json = JSON.parse(req);
});

答案 1 :(得分:0)

尝试使用a

Promise