[英]Wait for promise in a forEach loop
我從數據庫中收到一個圖書清單,作為一個承諾。
如果成功加載了初始書籍清單,則將書籍傳遞給實用程序功能來進一步處理書籍。
實用程序函數中有一個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
})
}
修改addInfo
方法,使其將諾言存儲在數組中,然后返回Promise.all
,當所有諾言都解決后, Promise.all
將解決。
假設您的方法返回了一個Promise,看起來像他們做的那樣,
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"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.