在 forEach 循环中等待 promise

Jes*_*est 6 javascript arrays loops asynchronous promise

我正在从数据库中收到一份作为 Promise 的书籍清单。

如果成功加载了初始书籍列表,则通过将它们传递给实用程序函数来进一步处理这些书籍。

实用程序函数内部是一个 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
        })
    })
Run Code Online (Sandbox Code Playgroud)

从 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);
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

获取附加信息并返回新的书籍数组的实用函数

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
    })
}
Run Code Online (Sandbox Code Playgroud)

ade*_*neo 5

修改该addInfo方法,使其将承诺存储在一个数组中,并返回Promise.all,当所有承诺都已解决时,它将解决。

假设您的方法返回一个承诺,并且看起来它们确实如此,例如

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"
}
Run Code Online (Sandbox Code Playgroud)