While循环请求JSON

While loop requesting JSON

本文关键字:JSON 请求 循环 While      更新时间:2023-09-26

我一直在尝试做一些我认为很简单的事情,但现在我很确定我已经很好地并且真正地过度简化了它,或者只是在我的循环中搞砸了一些基本的东西。我试图通过包含JSON对象的链接列表搜索,以找到包含特定数据的特定链接。

我正在查看的JSON链接如下所示:

链接1:

{"genre": "fantasy", "title": "Book 1"}

链接2:

{"genre": "scifi", "title": "Book 2"}

我的循环的目标是找到一本类型为"科幻"的书,但是我当前的代码只是导致或没有发生任何事情。如果有人能发现我做错了什么,请告诉我。如果不是很明显,我在这方面是新手,所以任何建议都是非常欢迎的。

function find_book(){ // called by button onclick
    var i = curr_line+1 // current line's default value is 0
    var x = 0;
    var limit = bookcount-1; //bookcount is total number of books
    while(x != 1) {
        request= new XMLHttpRequest();
        request.open("GET","http://example.com/books/?book="+i,true);                    
        request.onreadystatechange=function() {
            if(request.readyState==4 && request.status==200) {
                var jsonbook = JSON.parse(request.responseText);
                alert('genre is'+jsonbook.genre);
            }
        }
        request.send()
        if(jsonbook.genre == "scifi"){
            alert('book is at '+i);
            x=1;
        }
        if(i>limit){
            alert('end of book list');
            x=1;
        }
        i++;
    }
}

JSON书超出范围。此外,ajax调用异步发生(这是ajax中的a),尝试递归地调用一个直接的函数。某物:

function check_book(bookID, limit) {
    request = new XMLHttpRequest();
    request.open("GET", "http://example.com/books/?book=" + bookID, true);
    request.onreadystatechange = function () {
        if (request.readyState == 4 && request.status == 200) {
            var jsonbook = JSON.parse(request.responseText);
            alert('genre is' + jsonbook.genre);
            if (jsonbook.genre == "scifi") {
                alert('book is at ' + bookID);
                return;
            } else if (bookID > limit) {
                alert('end of book list');
                return,
            } else {
                bookID++;
                check_book(bookID, limit)
            }
        }
    }
    request.send()
}
function find_book(){ // called by button onclick
    var i = curr_line+1 // current line's default value is 0
    var limit = bookcount-1; //bookcount is total number of books
    check_book(i, limit);
}

第一次观察。试着把下面的代码移到你的alert('genre is'+jsonbook.genre);行下面。

if(jsonbook.genre == "scifi"){
 alert('book is at '+i);
 x=1;
 }
if(i>limit){
alert('end of book list');
x=1;
}

它应该像下面这样,因为调用是异步的,一旦它返回,你必须用你的逻辑处理jsonobject

   if(request.readyState==4 && request.status==200)
    {
       var jsonbook = JSON.parse(request.responseText);
       alert('genre is'+jsonbook.genre);
       if(jsonbook.genre == "scifi"){
         alert('book is at '+i);
         x=1;
       }
       if(i>limit){
           alert('end of book list');
            x=1;
       }
    }