Javascript 纯JS中的AJAX完整处理程序

Javascript 纯JS中的AJAX完整处理程序,javascript,ajax,Javascript,Ajax,我在纯Javascript中使用AJAX,它返回false如果失败,否则返回json数据: var responsefromURL = loadAjaX(url); if(responsefromURL != false) { alert("Failed to fetch Data from URL. (Store/Store)"); } else { this.prepareStoreFromJSON(respon

我在纯Javascript中使用AJAX,它返回
false
如果失败,否则返回
json
数据:

    var responsefromURL = loadAjaX(url);
    if(responsefromURL != false)
    {
        alert("Failed to fetch Data from URL. (Store/Store)");
    }
    else
    {
        this.prepareStoreFromJSON(responsefromURL);
    }
由于Javascript是异步的,
responseFromURL
不会尽快加载。在jQuery中,我可以使用
ajax.complete
协议。如何在纯Javascript中实现这一点我想从另一个函数加载AJAX,因为我有很多方法可以实现这一点,所以不能反复键入相同的AJAX代码。

针对香蕉公司的评论

我们可以做到:

 ajax.open("GET",url,false);
但是,大多数浏览器都禁用了此功能并抛出错误:主线程上的同步XMLHttpRequest被弃用,因为它会对最终用户的体验产生有害影响。如需更多帮助,请查看


可以在onreadystatechange属性上设置函数

见文件

范例

var COMPLETE = 4;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET",url,true);
xmlhttp.onreadystatechange=function() {

    // if complete and status 200
    if (xmlhttp.readyState == COMPLETE && xmlhttp.status == 200) {
        if (xmlhttp.responseText != null) {
            prepareStoreFromJSON(xmlhttp.responseText);
        }
        else {
            alert("Failed to fetch Data from URL. (Store/Store)");
        }
    }
}
试试这个:

var xmlhttp;
if (window.XMLHttpRequest)
  {
  xmlhttp=new XMLHttpRequest();
  }
else
  {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    var responsefromURL = xmlhttp.responseText;
    if(responsefromURL != false)
    {
        alert("Failed to fetch Data from URL. (Store/Store)");
    }
    else
    {
var responseJSON = eval('('+responsefromURL+')');        
this.prepareStoreFromJSON(responseJSON);
    }
    }
  }
xmlhttp.open("GET",url,true);
xmlhttp.send();

假设这是您的AJAX函数:

function loadAjaX(url, callback)
{
    var ajax;
    if (window.XMLHttpRequest)  {
        ajax = new XMLHttpRequest();
    } else {
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }
    ajax.onreadystatechange = function() {
        if (ajax.readyState==4 && ajax.status==200) {
            callback(ajax.responseText);
        }
    }
    ajax.open("GET",url,true);
    ajax.send();
}
现在,您可以在完成时使用
响应
调用回调方法:

loadAjaX(url, callback);

将false设置为
XMLHttpRequest.open()
方法的第三个参数会使调用同步。@这是有道理的,但大多数浏览器都禁用了此功能并抛出错误:
synchronous XMLHttpRequest在主线程上被弃用,因为它会对最终用户的体验产生有害影响。如需更多帮助,请查看http://xhr.spec.whatwg.org/.
这个错误也有道理,毕竟你的网站会一直挂起,直到ajax恢复。但是,您可以将其放入函数中,并从
setTimeout()
调用它,它将在新线程上运行整个过程。@code>setTimeout()中的香蕉计时器不会在单独的线程中运行,它们只会在超时结束后的下一个事件循环中运行。()据我所知,在单独的执行上下文中运行JS的唯一方法是web workers。这是一个我也找到的解决方案。但是我有一个有组织的类,希望在不同的点调用AJAX方法。我一直在寻找类似于complete上的
。嗯,这是一个我也找到的解决方案。但是我有一个有组织的类,希望在不同的点调用AJAX方法。我正在寻找类似complete
上的
。如果我想使用多个参数调用该怎么办?