如果我在XHR的onreadystatechange函数中,我可以轻松地执行document.title = xhr.responseText
,但是如果我让函数返回responseText,我就不能设置一个等于我的XHR外层包装的变量来使它等于响应;有没有办法去做呢?
我的包装:
ajax = function(url, cb)
{
xhr = (window.XMLHttpRequest)
? new XMLHttpRequest()
: new ActiveXObject('Microsoft.XMLHTTP');
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
{
cb(xhr.responseText);
};
}
xhr.open('get', url, true);
xhr.send();
};
现在,如果我做了类似的事情:
ajax('bacon.txt', function(_)
{
document.title = _;
}
它绝对完美; document.title实际上成为了对bacon.txt的调用的responseText。但是,如果我尝试以这种方式实现它:
document.title = ajax('bacon.txt', function(_)
{
return _;
}
没有这样的运气。任何人都可以澄清为什么会这样吗?
};
答案 0 :(得分:7)
您将ajax函数的返回分配给标题。 ajax函数本身不会返回任何内容。
AJAX的重点是函数立即返回它已向服务器发出请求,之前收到任何响应。你正在为title属性分配undefined(BTW,我通常有我的ajax函数返回正在使用的xhr,允许我在必要时中止)。
当请求完成时,将调用回调(代码中的cb)函数,因此您的原始代码有意义,它会进行分配。
答案 1 :(得分:0)
onreadystatechange函数的结果与你的“ajax”函数不一样...... 您可以使您的帖子同步,并使ajax函数返回相同,但如果响应时间过长,它将最终在浏览器中延迟用户响应。
你可以做的更好的是找到另一种方法,如你所愿。我的意思是,不要试图让它以这种方式工作,因为它会更糟。