簡體   English   中英

在forEach循環中等待諾言

[英]Wait for promise in a forEach loop

我從數據庫中收到一個圖書清單,作為一個承諾。

如果成功加載了初始書籍清單,則將書籍傳遞給實用程序功能來進一步處理書籍。

實用程序函數中有一個forEach循環,該循環遍歷每本初始書,進行異步調用以獲取更多信息,創建新書對象,並將其添加到新書數組(稱為updatedBooks )中。

問題:我不知道如何等待每本書的forEach循環完成以及如何返回新書的數組。

目前,我只收到一本更新的書,而不是全部

我的最終目標是在res.json()對象中擁有更新書籍的列表

這是我目前的結構

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM