【问题标题】:Wait for promise in a forEach loop在 forEach 循环中等待 promise
【发布时间】:2018-02-12 02:42:32
【问题描述】:

我收到了来自数据库的书籍列表作为 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
        })
    })

从 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
    })
}

【问题讨论】:

    标签: javascript arrays loops asynchronous promise


    【解决方案1】:

    修改addInfo 方法,使其将promise 存储在一个数组中,并返回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"
    }
    

    【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2018-06-09
    • 2018-01-06
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多