首页 > 解决方案 > XMLHttpRequest.readyState & XMLHttpRequest.status 最终阶段比较

问题描述

我有一个脚本,我想看看是否可以修复比较。

this.refreshLyric = function (currentSong, currentArtist) {
    
     var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {
            if (this.readyState === 4 && this.status === 200) {
                var data = JSON.parse(this.responseText);

                var openLyric = document.getElementsByClassName('lyrics')[0];

                if (data.type === 'exact' || data.type === 'aprox') {
                    var lyric = data.mus[0].text;

                    document.getElementById('lyric').innerHTML = lyric.replace(/\n/g, '<br />');
                    //debugging
                    console.log("Success Lyric found");
                    
                } else {
                //debugging
                    console.log("Lyric not found");
                }
            } else {
               //HERE if the condition is not met, it goes to another function
               var page = new Page();
               page.refreshLyric2(currentSong, currentArtist);
              }
        }
        xhttp.open('GET', 'https://api.vagalume.com.br/search.php?apikey=' + API_KEY + '&art=' + currentArtist + '&mus=' + currentSong.toLowerCase(), true);
        xhttp.send()
}

代码很简单,但我想要的我无法实现。

这种比较是真实的,必须经过一些以前的状态:

if (this.readyState === 4 && this.status === 200) {

XMLHttpRequest.readyState:

值 状态 描述

0 UNSENT 客户端已创建。open() 尚未调用。

1 OPENED open() 已被调用。

2 HEADERS_RECEIVED send() 已被调用,并且标头和状态可用。

3 LOADING 下载;responseText 保存部分数据。

4 DONE 操作完成。

XMLHttpRequest.status:

在请求完成之前,status 的值为 0。浏览器也会报告状态为 0,以防 XMLHttpRequest 错误。

我想要做的是,如果状态的最后阶段比较分别与 4 和 200 不同,则转到另一个函数。

if (this.readyState === 4 && this.status === 200) {
//run this code
.....
 } else {
//Go to another function
   var page = new Page();
   page.refreshLyric2(currentSong, currentArtist);
 }

有可能做到这一点,还是我在做白日梦?

标签: javascriptxmlhttprequest-states

解决方案


如果您希望根据状态在最后阶段执行不同的操作,则需要嵌套if语句。第一个if检测到最后阶段,然后测试状态。

this.refreshLyric = function(currentSong, currentArtist) {

  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4) {
      if (this.status == 200) {
        var data = JSON.parse(this.responseText);

        var openLyric = document.getElementsByClassName('lyrics')[0];

        if (data.type === 'exact' || data.type === 'aprox') {
          var lyric = data.mus[0].text;

          document.getElementById('lyric').innerHTML = lyric.replace(/\n/g, '<br />');
          //debugging
          console.log("Success Lyric found");

        } else {
          //debugging
          console.log("Lyric not found");
        }
      } else {
        // go to another function
        var page = new Page();
        page.refreshLyric2(currentSong, currentArtist);
      }
    }
  }
  xhttp.open('GET', 'https://api.vagalume.com.br/search.php?apikey=' + API_KEY + '&art=' + currentArtist + '&mus=' + currentSong.toLowerCase(), true);
  xhttp.send()
}


推荐阅读