是否有更简单的方法来链式操作来自MongoDB结果的Promise?
是否有更简单的方法来链式操作来自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) }) }
有没有更简单的方法来实现这个功能?使用这种方法会使应用程序充斥着代码,而且还没有包括错误处理。
这篇文章讨论了如何在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链式调用,并提供了一些解决方法和示例代码。