是否有更简单的方法来链式操作来自MongoDB结果的Promise?

8 浏览
0 Comments

是否有更简单的方法来链式操作来自MongoDB结果的Promise?

这个函数列出了MongoDB数据库中的所有集合,并显示每个集合中的文档数量(使用bluebird promises)。

function listMongoCollections(db) {
    var promises = []
    db.listCollections().toArray().then((docs) => {
        docs.forEach((doc) => {
            promises.push(
                new Promise((resolve) => {
                    db.collection(doc.name).count().then((count) => {
                        doc.count = count
                        resolve()
                    })
                })
            )
        })
        return Promise.all(promises)
    })
}

有没有更简单的方法来实现这个功能?使用这种方法会使应用程序充斥着代码,而且还没有包括错误处理。

0
0 Comments

这篇文章讨论了如何在MongoDB的结果中链式地使用Promise,并提供了一些解决方法。

问题的原因是代码中使用了嵌套的.then(),造成了代码的冗长和可读性的降低。

为了解决这个问题,文章给出了一些方法:

1. 使用.map()方法将一个集合数组转换为一个Promise数组,而不是手动使用.push()将其添加到一个数组中。

2. 避免将Promise包装在新的Promise中。

3. 尽量少地嵌套.then()。在下面的示例中,我们可以注意到,第一部分只返回一个Promise数组。只有在返回主函数之前,我们将其包装在.all()的Promise中。

文章还给出了几个示例代码来演示如何简化Promise的链式调用。第一个示例中,我们可以进一步简化代码,去除了return语句和中间的docs常量。第二个示例中,我们使用了async/await关键字,使代码更易读。然后文章提到,这些只是示例,MongoDB可能提供了更好的解决方案。

文章还提到,由于使用的是Bluebird promises,可以使用.map()和.all()方法来简化代码。

最后,文章中提出了一个小的批评,认为去除return语句并不会提高代码的可读性。作者认为在快速浏览代码时,函数似乎没有返回任何内容,直到意识到没有大括号为止。然而,这可能更多是对箭头函数语法的批评,而不是对解决方法的批评。

这篇文章讨论了如何简化MongoDB结果中的Promise链式调用,并提供了一些解决方法和示例代码。

0