我有一个函数 foo ,它发出一个 Ajax 请求。我尝试从回调中返回数据并成功获取带有“xhr.onload”的数据,但得到了带有“xhr.onreadystatechange”的空字符串(“”)。
谁能告诉我为什么??
非常感谢你!
function foo(url){
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open("GET",url,true);
// xhr.onload = function(){
// if(xhr.status == 200){
// resolve(xhr.responseText);
// }else{
// reject("false")
// }
// }
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState && xhr.status == 200){
resolve(xhr.responseText);
}else{
reject("false")
}
}
})
}
foo(url).then(function (data){
console.log(data)
},function (err){
console.log(err)
})
您的onreadystatechange
处理程序不正确。您需要检查readyState
值 4(不仅仅是任何真实值),并且您不想拒绝直到readyState
4:
if(xhr.readyState === 4){
if (xhr.status == 200) { // or xhr.status >= 200 && xhr.status < 300
resolve(xhr.responseText);
} else {
reject("false")
}
}
但是对于现代浏览器,您可能会fetch
改用它,它已经提供了一个承诺。请确保不要犯这些常见错误(这是我贫血的小博客上的帖子)。
至于为什么你看到了你所看到的,因为你调用了open
并且send
在附加处理程序之前显然你没有得到readyState
1(打开)的回调,所以看起来你得到的第一个回调是在收到标题时(readyState
2 ),此时xhr.status
将被设置——所以你正在解决你的承诺,但当然,还没有收到请求正文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句