我正在尝试在 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/