为什么 Promise 返回一个空字符串?

西尔维娅

我有一个函数 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)
})
TJ克劳德

您的onreadystatechange处理程序不正确。您需要检查readyState值 4(不仅仅是任何真实值),并且您不想拒绝直到readyState4:

  if(xhr.readyState === 4){
      if (xhr.status == 200) { // or xhr.status >= 200 && xhr.status < 300
          resolve(xhr.responseText);
      } else {
          reject("false")
      }
  }

但是对于现代浏览器,您可能会fetch改用它,它已经提供了一个承诺。请确保不要犯这些常见错误(这是我贫血的小博客上的帖子)。

至于为什么你看到了你所看到的,因为你调用了open并且send在附加处理程序之前显然你没有得到readyState1(打开)的回调,所以看起来你得到的第一个回调是在收到标题时(readyState2 ),此时xhr.status将被设置——所以你正在解决你的承诺,但当然,还没有收到请求正文。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

为什么我对WinGetTitle的调用返回一个空字符串?

为什么 req.query.code 返回一个空字符串?

为什么此请求返回一个空字符串?

为什么nextLine()返回一个空字符串?

为什么我的函数返回一个空字符串?

为什么json_encode返回一个空字符串

为什么`TRegEx.split` 返回一个空字符串作为第一个元素?

为什么从promise返回的字符串是不确定的?

为什么 Vuex 的 action 返回一个 promise<pending>?

为什么0.ToString(“#。##”)返回一个空字符串而不是0.00或至少为0?

为什么我的所有EditText.getText()。toString()返回一个空字符串?

为什么这个(主要是)空的Perl子例程返回一个空字符串?

为什么在Django模型图像中,Media.url返回一个空字符串,而不是图像链接?

为什么在for循环中第二次运行函数会返回一个空字符串?

为什么连接两个空字符串会导致一个空字符串?

为什么在 C++ 中将字符串和 char 连接起来会返回一个空字符串?

当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

添加一个空字符串vs toString-为什么不好?

为什么PHP将“ \ r \ n”添加到一个空字符串?

为什么我从 jquery find().text() 得到一个空字符串?

为什么我的密码字段的值总是一个空字符串?

为什么element.style.backgroundColor属性会给出一个空字符串?

为什么我的密码字段的值总是一个空字符串?

Promise.all([]) 返回一个已解决的 promise,但 Promise.race([]) 返回一个挂起的 promise。他们为什么不同?

为什么返回Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID)一个空字符串;

为什么在这种情况下re.findall()返回一个空列表,而另一个返回一个空字符串的列表?

为什么 promise 没有返回?

为什么Body.json()返回Promise?