Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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/jquery/73.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 Promise.map在Promise.map中_Javascript_Jquery_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript Promise.map在Promise.map中

Javascript Promise.map在Promise.map中,javascript,jquery,node.js,promise,bluebird,Javascript,Jquery,Node.js,Promise,Bluebird,我试图在Promise.mapSeries/Promise.map中使用Bluebird的Promise.mapSeries/Promise.map返回JSON对象,但无法正确返回它们。功能如下: function getMovieDetails(link){ return new Promise(function(resolve, reject) { request(link, function(error, response, body){ var request =

我试图在Promise.mapSeries/Promise.map中使用Bluebird的Promise.mapSeries/Promise.map返回JSON对象,但无法正确返回它们。功能如下:

function getMovieDetails(link){
return new Promise(function(resolve, reject) {
    request(link, function(error, response, body){
        var request = Promise.promisifyAll(require("request"), {multiArgs: true});

        var $ = cheerio.load(body);

        var movieYears = "Years";
        var movieYearLinks = [];

        movieYearLinks.each(function(index, item) {
            var movieYear = $(item).text();
            var movieYearLink = $(item).attr("href");
            movieYearLinks.push(movieYearLink);
        });

        Promise.mapSeries(movieYearLinks, function(url) {
            return request.getAsync(url).spread(function(response,body) {
                var $ = cheerio.load(body);
                var movie = {};
                var year = "YEAR".text();

                movie["year"] = year;

                var movieActorsArray = [];
                movieActors.each(function(index, item){
                    var movieActor = $(item).text();
                    movieActorsArray.push(movieActor);
                });
                movie["movieActors"] = movieActorsArray;

                var recommendedMovies = //SOME ROWS;
                var recommendedMoviesLinks = [];

                recommendedMovies.each(function(jndex, jtem){
                    var recommendedRowObject = {};

                    var recommendedText = .text();

                    var recommendedLink = .attr("href");

                    recommendedRowObject["recommendedText"] = recommendedText
                    recommendedRowObject["recommendedLink"] = recommendedLink
                    recommendedMoviesLinks.push(recommendedLink);
                });

                Promise.mapSeries(recommendedMoviesLinks, function(url) {
                    return request.getAsync(url).spread(function(response,body) {
                        var $ = cheerio.load(body);
                        var obj = {};
                        //  GET SOME OTHER DESCRIPTION FROM THE RECOMMENDED MOVIE LINK

                        return obj;
                        });
                }).then(function(results) {
                    // results here returns an array of recommended movie links objects.
                }).catch(function(err) {
                });
                return main;
            });
        }).then(function(results) {
            // results here returns an array of movies

            //  I want to be able to link each movie with its recommended movies.
        }).catch(function(err) {
            console.log("Big Error " + err);
        });
    });
});
}

对我的代码和上下文的一些解释

主页是一个包含电影年的页面。我已经循环通过它们来获取这些年的链接,并将它们放入一个数组movieYearLinks中

接下来,我使用Promise.mapSeries获得了一些关于电影的基本信息。在这些基本信息中,表中列出了推荐的电影链接。我已经将它们循环并放入一个数组,推荐MoviesLinks

在此之后,我将在之前获取一些其他推荐的电影(RecommendeMovieObject)信息

我想用所有这些信息创建一个JSON对象。JSON对象应该类似于

{movieYear:2017,movieLink:…,RecommendeMovies(这是一个数组) 推荐移动对象的名称:}


我对实现这一目标的任何解决方案都持开放态度。提前谢谢。

您不需要嵌套承诺,承诺的全部意义在于不必嵌套回调。一个新的承诺要么被错误拒绝,要么被价值解决。您的代码应该类似于:

let getMovieDetails = function(link){
   return new Promise(function(resolve,reject){
       request(link,function(err,response,body){
         err ? reject(err):resolve(body)
       }
   }).then(function(body){
     // do some cherio stuff
     return dataList
   }).then(function(dataList){
       return Promise.all(dataList.map(function(d){return // a promise of d}) 
   })
}

let finalData = getMovieDetails(link).then(function(data){ 
    //do some computation
}).catch(function(e){ // handle errors })

根据您的节点版本,根本不需要蓝鸟。Javascript支持承诺。

您不需要嵌套承诺,承诺的全部意义在于不必嵌套回调。一个新的承诺要么被错误拒绝,要么被价值解决。您的代码应该类似于:

let getMovieDetails = function(link){
   return new Promise(function(resolve,reject){
       request(link,function(err,response,body){
         err ? reject(err):resolve(body)
       }
   }).then(function(body){
     // do some cherio stuff
     return dataList
   }).then(function(dataList){
       return Promise.all(dataList.map(function(d){return // a promise of d}) 
   })
}

let finalData = getMovieDetails(link).then(function(data){ 
    //do some computation
}).catch(function(e){ // handle errors })

根据您的节点版本,根本不需要蓝鸟。Javascript支持承诺。

您没有解决您正在创建的承诺。还可以尝试通过取消嵌套承诺来清理流程(这是一种糟糕的做法)。请记住,您可以通过返回有用的内容来链接一个又一个承诺。在
Promise.mapSeries()
前面添加
return
,使其链接到承诺链中。首先,避免!什么是
main
,为什么
返回它?如果在函数中执行任何异步操作(包括
mapSeries
回调函数),则需要为结果返回承诺。您不是在
resolve
-ing正在创建的承诺。还可以尝试通过取消嵌套承诺来清理流程(这是一种糟糕的做法)。请记住,您可以通过返回有用的内容来链接一个又一个承诺。在
Promise.mapSeries()
前面添加
return
,使其链接到承诺链中。首先,避免!什么是
main
,为什么
返回它?如果在函数中执行任何异步操作(包括
mapSeries
回调函数),则需要为结果返回一个承诺。OP显然希望至少嵌套两个循环。承诺的意义不是完全避免嵌套,而是在任何时候都能脱离嵌套。OP似乎肯定希望至少嵌套两个循环。承诺的意义不是完全避免筑巢,而是能够在任何时候摆脱筑巢。