等待forEach循环中的promise

时间:2017-09-03 19:43:58

标签: javascript arrays loops asynchronous 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
    })
}

1 个答案:

答案 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}}