javascript - Promise.map 内的 Promise.map

标签 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.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 获取有关电影的一些基本信息。在该基本信息中,表格中列出了推荐的电影链接。我已经循环它们并将它们放入一个数组中,recommulatedMoviesLinks。

之后,我将去获取一些其他推荐电影(recommendedMovieObject)信息。

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

{ movieYear: 2017, movieLink: ..., recommendedMovies (This is an array of recommendedMovieObjects): }

我愿意接受任何实现这一目标的解决方案。预先感谢您。

最佳答案

您不需要嵌套 promise , promise 的全部要点是不必嵌套回调。新的 Promise 需要要么因错误而被拒绝,要么因值而被解决。您的代码应该类似于:

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

根据您的 Node 版本,根本不需要 bluebird。 Javascript 支持 Promise。

关于javascript - Promise.map 内的 Promise.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42586386/

相关文章:

c# - 如何显示流返回的 pdf(在 JsonResult 中)?

javascript - 如果 localStorage 为 null,则从 json 文件设置

javascript - 让 turn.js 使用类而不是 id

javascript - 在 X 小时后使我的链接过期

JQueryUI 拖放教程在 IE9 和 IE7 中破解

jQuery:找到所有图像链接并将它们转换为一些默认拇指?

javascript - 当 return new Promise((resolve, reject) => {}) 忘记调用 resolve 或 reject 时会发生什么?

javascript - 向所有机器人用户发送新消息

mysql - Node.js Lambda - 将 TypeORM 与 MySql 结合使用

javascript - Ember js - 在每个循环中排序和过滤时模板中的正确语法