Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当循环请求JSON时_Javascript_Json - Fatal编程技术网

Javascript 当循环请求JSON时

Javascript 当循环请求JSON时,javascript,json,Javascript,Json,我一直在尝试做一些我认为很简单的事情,但现在我很确定我已经完全过度简化了它,或者只是把我的循环的一些基本内容弄糟了。我试图搜索包含JSON对象的链接列表,以找到包含特定数据的特定链接 我正在查看的JSON链接如下所示: 链接1: {"genre": "fantasy", "title": "Book 1"} 链接2: {"genre": "scifi", "title": "Book 2"} 我循环的目标是找到一本“科幻”类型的书,然而我当前的代码只是导致或没有发生任何事情。如果有人能发现我

我一直在尝试做一些我认为很简单的事情,但现在我很确定我已经完全过度简化了它,或者只是把我的循环的一些基本内容弄糟了。我试图搜索包含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++;
    }
}

第一次观察。尝试将下面的代码移动到您的
警报下(“类型为”+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;
       }
    }

JSON手册超出范围。另外,ajax调用是异步进行的(这是ajax中的a),请尝试调用一个直接的函数recursivley。例如:

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);
}

这仍然会导致调用函数导致浏览器崩溃。不过,感谢您的建议。浏览器崩溃不适用于此代码。。这是因为更多的内存密集型工作。。有点像一个大环