【发布时间】:2014-08-28 05:57:32
【问题描述】:
我是 Promises 的新手,我想知道在沿链向下传递时保留变量的最佳做法是什么?
通过 Promise 连接到 MongoDB 非常简单:
connectToMongoDB(data).done(function(db) {
var collection = db.collection('test_inserts');
// do more stuff here
});
但是如果我必须连接到两个不同的数据库会发生什么?
connectToMongoDB1(data1).then(function(db1) {
return connectToMongoDB2(data2);
}).done(function(db2) {
var collection = db1.collection('test_inserts');
// ERROR: db1 is undefined
});
这个错误完全有道理。但是我如何在不改变我的connectToMongoDB2() 函数的情况下转发db1,因为我想保持connectToMongoDB2() 和我所有的承诺都非常通用?
我的意思是,我可以包裹一个对象来存储所有相关的东西,但这看起来有点老套:
var relevantStuff = {};
connectToMongoDB1(data1).then(function(db1) {
relevantStuff.db1 = db1;
return connectToMongoDB2(data2);
}).done(function(db2) {
var collection = relevantStuff.db1.collection('test_inserts');
// do more stuff here
});
最佳做法是什么?
【问题讨论】:
-
嵌套回调。不完全是。其他所有东西(除了生成器)都会看起来很老套。
-
查看 Bluebird 中的
Promise.using- 这是一个很好的问题,当您在异常条件下处理多个资源时,这会得到 很多 诡计。 -
另外,像 Bluebird 这样的一些 Promise 库包含可以让您更轻松地执行此操作的方法(例如
.bind) - 我们可以假设一个特定的 Promise 库吗? -
@BenjaminGruenbaum:我正在使用 Bluebird 来构建我的承诺。我必须通读它的文档。感谢您的提示!
标签: javascript node.js promise