Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 如何在res.on(';end';,function()){..}内部循环,以及res.on(';end)如何真正工作?_Javascript_Node.js_Express_Callback - Fatal编程技术网

Javascript 如何在res.on(';end';,function()){..}内部循环,以及res.on(';end)如何真正工作?

Javascript 如何在res.on(';end';,function()){..}内部循环,以及res.on(';end)如何真正工作?,javascript,node.js,express,callback,Javascript,Node.js,Express,Callback,我试着把所有类似的问题通读一遍,但没有一个能完全回答我的问题 我正在尝试使用RottomotoeAPI检索与一般标题搜索相对应的电影列表,并为每个电影及其导演显示 现在,导演必须通过一个单独的json(对应于电影本身的json)获取,因此我必须执行http.request来获取电影列表,然后为每个电影制作另一个http.request来获取对应的导演 问题是当我尝试在第一个res.on('end',function(){..})中循环时,因此对于检索到的每一部电影,我可以执行另一个http.re

我试着把所有类似的问题通读一遍,但没有一个能完全回答我的问题

我正在尝试使用RottomotoeAPI检索与一般标题搜索相对应的电影列表,并为每个电影及其导演显示

现在,导演必须通过一个单独的json(对应于电影本身的json)获取,因此我必须执行
http.request
来获取电影列表,然后为每个电影制作另一个
http.request
来获取对应的导演

问题是当我尝试在第一个
res.on('end',function(){..})
中循环时,因此对于检索到的每一部电影,我可以执行另一个
http.request
。 我知道所有的请求都是异步的,但这不应该是个问题,相反,第一部电影的导演会连接到包含同一部电影导演的json对象,当我试图解析这个对象时,我会得到一个错误

undefined:1
.rottentomatoes.com/api/public/v1.0/movies/770687943/similar.json"}}{"id":9272
                                                                    ^
由于两个json响应连接到它们自己,因此它们不再是json,因此会出现错误

这就好像循环的第一次迭代(获取控制器的迭代)执行了两次。我认为这不应该是法维康等的问题

通过反复试验,我发现这种循环方式有效:

function httpGetMovies(response) {
var fullRequestQueryMovie = partialQueryMovie + apiKeyMovie + '&' + queryTermMovie + '&page_limit=2'+'&_prettyprint=true';
console.log('Calling -> ' + fullRequestQueryMovie);

var headersMovie = {
        'Content-Type': 'application/json'
};


var optionsMovie = {
        host: hostMovie,
        path: fullRequestQueryMovie,
        method: 'GET',
        headers: headersMovie
};

var jsonStringResponseMovie = '';

var req = http.request(optionsMovie, function(res) {
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);

    res.on('data', function(piece) {
        jsonStringResponseMovie += piece;
        //console.log("-----------------\n"+jsonStringResponseMovie);
    });

    var i=0;
    res.on('end', function addDirector() {

        var jsonObj = JSON.parse(jsonStringResponseMovie);

        var moviesBag = [];

            console.log("film n°: "+i+" of "+jsonObj.movies.length+" "+jsonObj.movies[i].title);


//              /-----begin nested http.request--------
            var singleMovieDirectors = [];

            var fullRequestSingleMovie = jsonObj.movies[i].links.self + '?apikey=' + apiKeyMovie ;

            var headersSingleMovie = {
                    'Content-Type': 'application/json'
            };

            var optionsSingleMovie = {
                    host: hostMovie,
                    path: fullRequestSingleMovie,
                    method: 'GET',
                    headers: headersSingleMovie
            };

            var jsonStringResponseSingleMovie = '';

            var req2 = http.request(optionsSingleMovie, function(res2) {
                console.log("request for "+optionsSingleMovie.path);
//                  console.log("statusCode: ", res.statusCode);
//                  console.log("headers: ", res.headers);

                res2.on('data', function(piece2) {
                    jsonStringResponseSingleMovie += piece2;
                });

                res2.on('end', function() {

                    var jsonObjSingleMovie = JSON.parse(jsonStringResponseSingleMovie);
                    console.log("directors > "+JSON.stringify(jsonObjSingleMovie.abridged_directors));
                    // response.send(blabla);

                if (i++ < jsonObj.movies.length-1){
                    addDirector()
                }
                    else{
                        console.log ("finished adding directors");
                    }

                });
            });

            req2.end();

            req2.on('error', function(e) {
                console.error(e);
            });

//              -------end of nested http.request-----------------




    });

});

req.end();

req.on('error', function(e) {
    console.error(e);
});


};
如果你已经找到了解决方案,你可能会问,问题出在哪里? 首先,我想和大家分享一下,因为这是我的一个朋友提出的,我从来没有想过在回调函数本身上循环。 第二,我不知道为什么我的选择不起作用。问题在哪里

抱歉发了这么长的帖子,我试图解释一切。如果是转载,请随时为我指出通往天堂的路


最大值

您可能会遇到这里提到的问题,这是很常见的

调试/跟踪的一种简单方法是使用大量console.log输出变量。这样你就能看到发生了什么

另一件有帮助的事情是使用
request-promise-json
模块,并可能使用
async/await
babel
。基本上可以是这样的:

  async function checkMovies(movies) {
    let result = [];
    for (let title of movies) {
      let movie = await request(`${base}?${movie}.json`);
      let movie.director = await request(`${base}${movie.director}.json`);
      result.push(movie);
    }
    return result;
  }
  async function checkMovies(movies) {
    let result = [];
    for (let title of movies) {
      let movie = await request(`${base}?${movie}.json`);
      let movie.director = await request(`${base}${movie.director}.json`);
      result.push(movie);
    }
    return result;
  }