我从数据库收到一份书籍列表作为承诺。
如果成功加载了初始书籍列表,则会通过将书籍传递给实用程序功能来进一步处理书籍。
实用程序函数内部是一个forEach循环,它循环遍历每个初始书籍,进行异步调用以获取其他信息,创建新的书籍对象并将其添加到新书的数组中(称为 updatedBooks )。
问题:我不知道如何等待forEach循环完成每本书以及如何返回新书的数组。
目前,我只收到一本更新的书,而不是全部
这是我目前的结构
controller.find(req.query)
.then(function (entities) {
awsUtil.addInfo(entities)
.then(function (updatedBooks) {
res.json({
confirmation: "success",
result: updatedBooks
})
})
.catch(function (err) {
res.json({
confirmation: "fail",
message: err
})
})
})
.catch(function (err) {
res.json({
confirmation: "fail",
message: err
})
})
从MongoDB获取初始图书的功能
find: function (params) {
return new Promise(function (resolve, reject) {
Book.find(params, function (err, books) {
if (err) {
reject(err)
return
}
console.log("Org. Books List: ", books)
resolve(books);
})
})
}
实用程序功能可获取更多信息并返回新的图书数据
addInfo: function (books) {
return new Promise(function (resolve, reject) {
let updatedBooks = [];
books.forEach(function (book) {
client.itemLookup({ //Call Amazon API to get book info
idType: 'ISBN',
itemId: book.isbn,
responseGroup: 'ItemAttributes,Images'
})
.then(function (results) {
const updatedBook = {
// The additional info from result gets added here
}
updatedBooks.push(updatedBook);
}).catch(function (err) {
console.log(err);
reject(err)
});
})
resolve(updatedBooks) //Return the array of new books
})
}
答案 0 :(得分:3)
修改Promise.all
方法,使其将promises存储在数组中,然后返回addInfo: function(books) {
let promises = books.map(function(book) {
return client.itemLookup({
idType : 'ISBN',
itemId : book.isbn,
responseGroup : 'ItemAttributes,Images'
}).then(function(results) {
return {
// The additional info from result gets added here
}
});
})
return Promise.all(promises); // catch errors where you call "addInfo"
}
,这将在所有promise都已解决后解析。
假设你的方法返回一个promise,看起来像是这样,就像
一样{{1}}