使用mongodb和nodejs解决承诺

您好,我是nodejs和mongodb的新手,在解决第二个承诺后,我无法解决我的第一个承诺。 解决后我可以看到第二个承诺的结果。 这是我的代码

var getShows = function () { return new Promise(function (resolve, reject) { usersdb.find(function (err, result) { if(err) return console.error(err); var usersFromCall = result; var task = function (users) { return new Promise(function (resolve, reject) { var user = { 'name': '', 'pages': [] } user.name = users.show; console.log(users); pagedb.find({'show' : user.name}, function (err, resp) { for(var j = 0 ; j <resp.length; j ++){ var pages = { 'pageId': ''}; pages.pageId = resp[j].pageId; user.pages.push(pages); } console.log(user); resolve({show: user}); }) }); }; var actions = usersFromCall.map(task); return Promise.all(actions); }).then(function () { resolve() }) }); }; 

在发现后,我解决了第一个承诺后的function?

以下应该工作:

 var getShows = function () { return new Promise(function (resolve, reject) { usersdb.find(function (err, users) { if (err) return console.error(err); var task = function (user) { return new Promise(/* ... */); }; var actions = users.map(task); Promise.all(actions).then(resolve, reject); }); }); }; getShows().then(function (results) { // Prints the result of each task as an array console.log(results); }); 

看着你的代码,似乎.find返回一个Promise。 所以,只是为了避免Promise构造函数反模式,请尝试以下,我相信它会产生正确的结果

 var getShows = function() { return usersdb.find() .then(result => Promise.all(result.map( users => pagedb.find({ show: users.show }) .then(resp => ({ show: { name: users.show, pages: resp.map(item => ({pageId: item.pageId})) } })) ) ) ); }; 

或ES5版本

 var getShows = function getShows() { return usersdb.find().then(function (result) { return Promise.all(result.map(function (users) { return pagedb.find({ show: users.show }).then(function (resp) { return { show: { name: users.show, pages: resp.map(function (item) { return { pageId: item.pageId }; }) } }; }); })); }); };