在forEach循环中等待Promise

6

我从数据库中获得一本书的列表,作为一个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个回答

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"
}

你能帮我解决 https://stackoverflow.com/questions/48683679/how-to-handle-database-asynchronous-operation-in-ionic-2-3/48686457#48686457 这个问题吗? - gaurang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接